spring容器 IOC控制反转和DI依赖注入——小马同学@Tian

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>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值