spring容器
1 IOC控制反转
1.1 IOC简介
IOC: Inversion Of Control
所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器(spring)负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,目的是为了获得更好的扩展性和良好的可维护性。
1.2 IOC的作用
通过IOC,开发人员不需要关心对象的创建过程,交给Spring容器完成,可以降低对象之间的耦合关系。具体的过程是,程序读取Spring 配置文件,获取需要创建的 bean 对象,通过反射机制创建对象的实例。
1.3 通过xml实现IOC的几种情况
1.3.1调用无参数构造器
<bean id="p1" class="com.rr.ioc.Person"></bean>
1.3.2带参数构造器
<bean id="p2" class="com.rr.ioc.Person">
<!-- 参数赋值顺序要和构造方法中参数顺序一致 -->
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
</bean>
<bean id="p3" class="com.rr.ioc.Person">
<!-- 通过index指定参数的索引 -->
<constructor-arg index="1" value="20"></constructor-arg>
<constructor-arg index="0" value="zhangsan"></constructor-arg>
</bean>
<!-- String str = new String("hello"); -->
<bean id="str" class="java.lang.String">
<constructor-arg value="hello"></constructor-arg>
</bean>
<bean id="p4" class="com.rr.ioc.Person">
<!-- 通过ref引用其他的bean ref的值,是其他bean的id值 -->
<constructor-arg index="1" value="20"></constructor-arg>
<constructor-arg index="0" ref="str"></constructor-arg>
</bean>
1.3.3静态方法创建对象
<bean id="p5" class="com.rr.ioc.MethodTest" factory-method="getInstance"></bean>
1.4 注解方式IOC
@Component 所有受Spring管理组件的通用形式
@Controller标识控制层组件 controller
@Service标识业务层组件 serevice
@Repository标识持久层组件 dao
以上这几个注解 就是创建对象的
2 DI依赖注入
2.1 DI简介
DI:Dependency Injection
所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到另一个对象中。
2.2 举例说明
A a = new A()
B b = new B();
a.setB(b)
Employee Department类
Employee emp = new Employee();
Department dept = new Department();
Emp.setDept(dept)
2.3 DI(依赖注入) 流程
1)通过构造函数(IOC控制反转)
2)通过set方法给属性注入值(DI依赖注入)
<bean id="d1" class="com.rr.di.Dog">
<property name="name" value="wangcai"></property>
</bean>
<!-- dao -->
<bean id="dogDao" class="com.rr.di.DogDao"></bean>
<!-- service -->
<bean id="dogService" class="com.rr.di.DogService">
<property name="dd" ref="dogDao"></property>
</bean>
<!-- action -->
<bean id="dogAction" class="com.rr.di.DogAction">
<property name="ds" ref="dogService"></property>
</bean>
2.4p标签注入 了解
增加如下约束:
xmlns:p="http://www.springframework.org/schema/p"
<bean id="name" class="java.lang.String">
<constructor-arg value="wangwu"></constructor-arg>
</bean>
<!-- p:属性名 -->
<bean id="dog" class="com.qianfeng.di.Dog" p:age="10" p:name="wangcai">
</bean>
<!-- p:属性名-ref, 引入其他对象 -->
<bean id="dog2" class="com.qianfeng.di.Dog" p:age="10" p:name-ref="name">
</bean>
2.5 自动注入autowire 了解
byType 根据类型注入
针对相同的类型,如果有多个对象,根据类型注入时会报错
byName 根据名称注入
2.6注解方式
2.6.1@Resource和@Autowried区别
@Resource用注解组装bean(注入),java提供的注解,默认根据名称进行注入
如果通过@Resource(name=”xxx”),只会根据名字进行注入;
如果没有指定,会根据修饰的变量的默认名注入,如果不存在,根据类型注入,如果有多个相同接口的类,报错,可以通过type属性指定具体的类
@Resource(type=UserDaoImpl2.class)
@Autowried 根据类型自动注入对象,如果匹配多个类型一致的对象(比如一个接口多个实现类),需要使用@Qualifier()根据名称选择具体注入哪一个对象
@Scope 设置bean的作用域,@Scope(scopeName=“singleton”)
注:需要导入aop相关的jar文件
spring-aop-5.1.5.RELEASE.jar
引入相关约束(绿色所示配置):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解扫描 自动扫描本包和它的子包下的注解 -->
<context:component-scan base-package="com.rr.anno"></context:component-scan>