当前位置: 首页 > wzjs >正文

浙江省建设厅网站查询百度seo公司

浙江省建设厅网站查询,百度seo公司,一个网站内容怎么规划,河南建设网站公司SpringBoot入门-(2) Spring IOC机制 Spring Spring是一个当前主流的轻量级的框架,发展到形状已经不仅仅是一个框架,而是形成以Spring为基础的生态圈,如(Spring Boot,Spring Cloud,Spring Security等) Spring 两大核心技术 控制反转(IoC)面…

SpringBoot入门-(2) Spring IOC机制

Spring

Spring是一个当前主流的轻量级的框架,发展到形状已经不仅仅是一个框架,而是形成以Spring为基础的生态圈,如(Spring Boot,Spring Cloud,Spring Security等)

Spring 两大核心技术

  • 控制反转(IoC)
  • 面向切面编程(AOP)

本文先介绍其一

控制反转(IoC/DI)

依赖注入(DI:Dependency Injection ):Spring通过创建容器的方式,来负责对象的创建、对象和对象之间关系的维护等

动机

在面向对象的系统设计中,底层的业务逻辑是由多个对象组成,对象之间通常存在复杂的联系,导致系统的耦合度很高,例如:

public class UserServiceImp implements UserService{private UserDao userdao = new UserDaoImp();...}

上述UserServiceImp类实现UserService接口,其中创建的私有成员变量是通过UserDaoImp类创建出来的实例。

UserDaoImp的业务逻辑产生变化或出现错误,都有可能需要修改UserServiceImp的代码,所谓产生了"牵一发而动全身"的系统高耦合度。

不难发现,系统越庞大,对象关系越复杂,系统耦合度越高,导致系统维护愈发困难。

因此,Spring横空出世,解决对象之间耦合度过高的问题。后来从产品发展为生态圈。

概念

究竟什么是控制反转?

先看下图:

在这里插入图片描述
首先是左图的情况,假设其他一个齿轮需要修改或不转动,都会导致其他的齿轮停止工作,这称为高耦合度。而右图,齿轮之间不存在依赖关系,工作相对独立,不会影响到其他齿轮的正常工作。这表现的就是"控制反转"的基本思想:

借助于“第三方”实现具有依赖关系的对象之间的解耦

齿轮之间的传动全部依靠“第三方”了, 全部对象的控制权全部上缴给“第三方”IOC容器,主动创建变为了被动注入, 这就是“控制反转”(依赖注入)这个名称的由来

代码

首先创建Maven项目(传送门:SpringBoot入门-(1) Maven【概念+流程】-CSDN博客),pom.xml文件导入相关spring依赖,包括测试依赖:

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies>

注意,这里没有定义依赖的版本,是通过父项目统一管理版本号

without Spring

我们先用常规的MVC架构实现一些简单逻辑,后面对比Spring架构就可以明显发现其优势和作用。

首先我们实现一个非常简易的商品存入数据库的逻辑:

在这里插入图片描述
部分代码如下:

  • ProductDaoImpl

    package com.example.Dao;import com.example.Dao.ProductDao;
    import com.example.entity.Product;public class ProductDaoImpl implements ProductDao {//这里是模拟商品存入,并没有真正存入数据库@Overridepublic void saveProduct(Product product) {System.out.println("保存商品信息");System.out.println(product.toString());}
    }
    
  • ProductServiceImpl

    package com.example.Service;
    import com.example.entity.Product;
    import com.example.Dao.*;public class ProductServiceImpl implements ProductService{private ProductDao productDao =  new ProductDaoImpl();//其他业务逻辑,如检查是否合法等@Overridepublic void saveProduct(Product product) {productDao.saveProduct(product);}
    }
    

可以看到在ProductServiceImpl中,我们通过new的方式创建实例对象并赋值给成员变量

测试代码:

test目录底下进行测试:

package com.example.Service;import com.example.entity.Product;
import org.junit.jupiter.api.Test;public class ProductServiceTest { //如果 Calculator 类和测试类处于相同的包或者符合 Java 的包访问规则,那么测试类就可以直接访问 ProductServiceImpl 类。@Testpublic void testSaveProduct() {ProductService productService = new ProductServiceImpl();productService.saveProduct(new Product(0, "test",12.7));}
}

可以看到控制台输出信息:
在这里插入图片描述

with spring

我们现在使用spring框架实现相同的功能

  • 方式一:配置文件

首先新建spring的配置文件,如图:
在这里插入图片描述

命名为applicationContext,可以看到文件中已经存在默认的内容(默认生成的XML文件的NameSpace,<bean>就是关键的标签。

容器中创建对象,本质就是在文件中配置一个bean

<beans></beans>中间添加我们想要创建的对象及注入依赖

    <bean id="productDao" class="com.example.Dao.ProductDaoImpl"/><bean id="productService" class="com.example.Service.ProductServiceImpl"><property name="productDao" ref="productDao"/></bean>

容器通过com.example.Dao.ProductDaoImpl类创建id为productDao的对象

对象属性的赋值通过<property>标签,需要在com.example.Service.ProductServiceImpl提供对应的setter方法:

    public void setProductDao(ProductDaoImpl productDao) {this.productDao = productDao;}

下一步,在测试程序中创建容器,并获取指定对象进行测试。

public class ProductServiceTest {//如果 Calculator 类和测试类处于相同的包或者符合 Java 的包访问规则,那么测试类就可以直接访问 ProductServiceImpl 类。@Testpublic void testSaveProduct() {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");ProductService productService = (ProductService) ac.getBean("productService");productService.saveProduct(new Product(0, "test",12.7));}
}

上述代码中,我们先创建了容器,然后根据xml文件中的配置获取对象,返回的类型是Object,注意转换类型。

观察到上述两种方式,spring将层与层之间的联系解耦,可以比较一下下面两段代码:

//解耦前
private ProductDao productDao =  new ProductDaoImpl();//spring
private ProductDao productDao;
//在配置文件中注入依赖
<bean id="productService" class="com.example.Service.ProductServiceImpl"><property name="productDao" ref="productDao"/>
</bean>

这样,我们在"更换齿轮"的时候就不用去修改Service层的代码,修改配置文件即可。(注意,配置文件依赖注入一定要在相应的地方添加setter方法,底层会进行调用)

  • 方式二: 注解实现IOC
  1. 注解+配置

当我们的项目很大的时候,使用配置文件就会出现问题,配置文件信息内容过大让人眼花缭乱,所以spring提供了注解的方式。

在这里插入图片描述
根据注解,我们可以把配置文件中的:

<bean id="productDao" class="com.example.Dao.ProductDaoImpl"/>

等效为:

@Repository("productDao")
//如果不给注解起名字,默认的名字为类名(首字母小写)
public class ProductDaoImpl implements ProductDao {//这里是模拟示范@Overridepublic void saveProduct(Product product) {System.out.println("保存商品信息");System.out.println(product.toString());}
}

Spring 默认不使用注解装配 Bean,因此我们需要在 Spring 的 XML 配置中,通过**context:component-scan** 元素开启 Spring Beans的自动扫描功能

<context:component-scan base-package="com.example.*"></context:component-scan>

其中base-package是你希望自动扫描的路径。

Bean的自动装配

使用@AutoWired注解实现自动装配,如:

public class ProductServiceImpl implements ProductService{@Autowiredprivate ProductDao productDao;
  1. 全注解

不使用spring配置文件,而是进行全注解开发,因此我们需要使用注解写一个配置类实现和annotation.xml的功能。

在config/目录下创建类文件:

@Configuration
@ComponentScan("com.example")
public class SpringConfig {
}

对应的测试代码:

    @Testpublic void testSaveProduct() {ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);ProductService productService = ac.getBean("productService", ProductService.class);

当然也可以在配置类中使用@Bean标签

@Configuration
@ComponentScan("com.example")
public class SpringConfig {@Bean(name = "productService")public ProductServiceImpl creat(){return new ProductServiceImpl();}
}

对应的测试代码修改一句即可:

ProductService productService = ac.getBean(ProductService.class);

http://www.dtcms.com/wzjs/285665.html

相关文章:

  • 深圳网站建设哪家口碑好南昌seo网站管理
  • 接单平台app重庆seo排名优化费用
  • 小地方做外卖网站怎样网络公司品牌推广
  • 做网站每月收入上海seo优化
  • 哪里的佛山网站建设子域名在线查询
  • 深圳网站域名注册网址大全百度
  • 万网官方网站seo排名优化推荐
  • shopify网站建设网站排名提高
  • 网站整体营销方案网络广告策划方案
  • 个人做网站需要学什么只是网站搜什么关键词
  • 海丰网站建设软文推广文案
  • 陕西住房和城乡建设部网站首页成都公司网站seo
  • 有什么做兼职的好的网站吗深圳推广公司哪家正规
  • 大数据智能营销获客系统seo网络优化推广
  • 深圳网站建设哪家公司便宜优化seo方案
  • wordpress+镜像下载优化教程
  • 临朐网站制作网站维护费用
  • 天津市城乡和住房建设厅网站搜索引擎营销的分类
  • 成都购物网站设计电子商务营销
  • 中国做的儿童编程网站现在推广什么app最挣钱
  • 动力做网站视频app推广
  • 台州地区网站建设爱站网站长seo综合查询
  • html5手机网站特效seo优化关键词排名优化
  • 成都网站原创推广普通话的意义论文
  • 做网站和做java的区别西安竞价推广托管
  • 图片网站 seo百度百家号注册
  • 大学学风建设网站上海哪家优化公司好
  • 微企申请网站优就业seo
  • 北京短视频代运营公司芭嘞seo
  • 天河企业网站建设seo和sem推广