Spring之IoC,DI依赖注入
一、IoC
1.1、IoC本质
IoC是Spring框架的核心内容,中文译为控制反转,它是一种设计思想,想要实现IoC我们就要使用一种方式就是DI-依赖注入。
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
我们要在Ioc中认知到的是:以前所有的东都是由程序控制进行创建,而现在我们可以不去这样做了,在使用Spring之后我们将组装号的Bean注入到Spring容器中,通过applicationContext.xml配置配置文件去设置,这样我们在以后要使用的时候就可以直接去Spring容器中拿到具体的Bean。
我们可以去做一个流程图。
其实这里我们只要明白控制反转是描述通过第三方来实现生产特定对象的方式就行了。以前我们创建对象需要通过自己手动去创建,但是现在交给了Spring去做。
二、DI(依赖注入)
2.1、概念
依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。
2.2、构造器注入
<!--
构造函数注入:
使用的标签:constructor-arg
标签出现的位置:bean标签内部
标签的属性
type:用于指定要注入的数据的数据类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引位置从0开始
name:用于指定给构造函数中指定名称的参数赋值(常用)
value:用于提供基本类型和string类型数据
ref:用于指定其他的bean类型数据,它指的就是在spring的Ioc核心容器中出现过的bean对象
-->
<bean id="a" class="com.ye.impl.a">
<constructor-arg name="name" value="text"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!--配置日期对象-->
<bean id="now" class="java.util.Date"></bean>
2.3、Set注入
Set注入是一个重点,要求被注入的属性必须要有set方法
常量注入
<bean id="address" class="com.ye.pojo.Address">
<property name="address" value="郑州"/>
</bean>
bean注入
<bean id="student" class="com.ye.pojo.Student">
<property name="name" value="zhang"/>
<property name="address" ref="address"/>
</bean>
其他注入
<bean id="moreComplexObject" class="example.ComplexObject">
<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">aaa@qq.com</prop>
<prop key="support">aaa@qq.com</prop>
<prop key="development">aaa@qq.com</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key ="a ref" value-ref="myDataSource"/>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
</bean>
<bean class="ExampleBean">
<property name="email">
<null/>
</property>
</bean>
p标签和c标签注入
导入约束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.ye.pojo.User" p:name="zhang" p:age="18"/>
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>
2.4、注解方式
-
@Autowired 自动装配通过类型 名字
如果Autowired不能唯一自动装配上属性,则需要@Qualifier(value = “XXX”) -
@Resource 自动装配通过先名字再类型
-
@Component:组件 放在类的上面,说明已经被spring管理了,就是bean
-
@Controller:web层
-
@Service:service层
-
@Repository:dao层
写上这些注解,就相当于将这个类交给Spring管理装配了!