Spring中的IOC与DI

IOC控制反转,将对象的创建权反转给了Spring。
DI依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。

一、DI(依赖注入)

1.1 Spring的属性注入

在这里插入图片描述

1.1.1 构造方法的方式的属性注入(开发常用)

在这里插入图片描述

1.1.2 Set方法的方式的属性注入

  • Set方法的属性注入
    在这里插入图片描述

  • Set方法设置对象类型的属性
    在这里插入图片描述

1.1.3 P名称空间的属性注入(Spring2.5以后)

  • 通过引入p名称空间完成属性的注入:

  • 写法:
    普通属性 p:属性名=”值”
    对象属性 p:属性名-ref=”值”

  • P名称空间的引入
    在这里插入图片描述

  • 使用p名称空间
    在这里插入图片描述

1.1.4 SpEL的属性注入(Spring3.0以后)

  • SpEL:Spring Expression Language,Spring的表达式语言。
  • 语法:#{SpEL}
    在这里插入图片描述

1.2 集合类型属性注入(了解)

<!-- Spring的集合属性的注入============================ -->
	<!-- 注入数组类型 -->
	<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
		<!-- 数组类型 -->
		<property name="arrs">
			<list>
				<value>王东</value>
				<value>赵洪</value>
				<value>李冠希</value>
			</list>
		</property>
		
		<!-- 注入list集合 -->
		<property name="list">
			<list>
				<value>李兵</value>
				<value>赵如何</value>
				<value>邓凤</value>
			</list>
		</property>
		
		<!-- 注入set集合 -->
		<property name="set">
			<set>
				<value>aaa</value>
				<value>bbb</value>
				<value>ccc</value>
			</set>
		</property>
		
		<!-- 注入Map集合 -->
		<property name="map">
			<map>
				<entry key="aaa" value="111"/>
				<entry key="bbb" value="222"/>
				<entry key="ccc" value="333"/>
			</map>
		</property>
	</bean>

二、IOC(控制反转)

2.1 XML版

  • Xml版用的是setter注入方式

2.1.1Bean的相关配置

2.1.1.1标签的id和name的配置
  • id :使用了约束中的唯一约束。里面不能出现特殊字符的。
  • name :没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
  • Spring和Struts1框架整合的时候
<bean name=”/user” class=””/>
2.1.1.2 Bean的生命周期的配置(了解)
  • init-method :Bean被初始化的时候执行的方法
  • destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
2.1.1.3 Bean的作用范围的配置(重点)
  • scope :Bean的作用范围
  • singleton :默认的,Spring会采用单例模式创建这个对象。
  • prototype :多例模式。(Struts2和Spring整合一定会用到)
  • request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
  • session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
  • globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session

2.1.2 spring中的Bean管理

2.1.2.1 Bean实例化的三种方式
2.1.2.1.1无参构造方法的方式(默认)

编写类
在这里插入图片描述
编写配置
在这里插入图片描述

2.1.2.1.2静态工厂实例化的方式

编写Bean2的静态工厂
在这里插入图片描述

配置
在这里插入图片描述

2.1.2.1.3实例工厂实例化的方式

Bean3的实例工厂
在这里插入图片描述

配置
在这里插入图片描述

2.1.3 分模块配置

2.1.3.1 在加载配置文件的时候,加载多个

在这里插入图片描述

2.1.3.2 在一个配置文件中引入多个配置文件

在这里插入图片描述

2.2 注解版

  • 注解版用的是构造方法注入

2.2.1 ApplicationContext.xml的配置

  • 开启注解和扫描
	<!--扫描注入-->
	<context:annotation-config />
	<!--扫描所有类上的注解-->
	<context:component-scan base-package="com.vp"/>
注意:开启所有类注解就不用配置扫描注入,也可都开启

2.2.2 类的注解(四种)

@Component @Service @Controller @Repository(2.5.6目前4个注解无区别)

  • @Component: 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
  • @Repository:用于将数据访问层(DAO层)的类标识为spring中的bean
  • @Service:通常作用在业务层(Service层),但是目前该功能与 @Component 相同。
  • @Constroller 通常作用在控制层(如springMVC的controller),但是目前该功能与 @Component 相同。

a)初始化的名字默认为类名首字母小写

2.2.3 注入数据的注解

2.2.3.1 @Autowired

用于对Bean的属性变量、属性的setter方法及构造方法进行标注。
自动按照类型注入,当容器中只有唯一一个对象时才能注入成功;当使用该注解时,就不需要set方法了

注意:当容器中有多个对象时,可以通过名称区别自动注入。如
@Autowired
private IAccountDao accountDao1;

2.2.3.2 @Qualifier

与@Autowired注解同时使用,当有多个实现类对象时,可以用该注解指定id来注入
该注解也可以单独用在方法参数上

2.2.3.3 @Value

作用:用于注入基本类型和String类型的数据
属性:
value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
SpEL的写法:${表达式}

2.2.3.4 byType和byName

@Autowried默认按类型进行注解
a) 默认按类型by type

  public class UserBiz {
	private UserDao uDao;
 	@Autowired
	public void setuDao(UserDao uDao) {
		this.uDao = uDao;
	}
}

b) 如果想用byName,使用@Qulifier

 	<bean id="admin" class="com.demo.dao.impl.UserDao_admin"></bean>       
    	<bean id="d" class="com.demo.dao.impl.UserDao_domestic"></bean>
    	<bean id="ubiz" class="com.demo.service.UserBiz" init-method="init" destroy-method="destroy">
</bean>
    @Autowired
	public void setuDao(@Qualifier("d") UserDao uDao) {
		this.uDao = uDao;
	}

2.2.4 关于对象作用域的注解

  • @Scope

与xml中的scope属性一样,用来改变对象的作用域
值:singleton、prototype、request、session、global-session

  • @Resources
    直接按照bean的id注入,可以单独使用,不能在方法参数上使用

注意:jdk9不能使用该注解

2.2.5 关于生命周期的注解(了解)

他们的作用就和在bean标签中使用init-method和destroy-method的作用是一样的
@PostConstruct:指定初始化时的方法
@PreDestroy:指定销毁时的方法


版权声明:本文为weixin_43951534原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。