DI:依赖注入
DI版HelloWorld
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
</dependencies>
</project>
控制反转(Inverse of Control, IOC):把对于成员变量赋值的控制权,从代码中转移(反转)到 Spring 工厂和配置文件中完成。
依赖注入 (Dependency Injection, DI),当⼀个类需要另⼀个类时,就意味着依赖,⼀旦出现依赖,就可以把另⼀个类作为本类的成员变量,最终通过 Spring 配置文件进行注入(赋值)。
依赖注入
容器的创建
创建方式:
- ClassPathXMLApplicationContext
- FileSystemXMLApplicationContext
- XMLWebApplicationContext
BeanFactory和ApplicationContext
ApplicationContext它是建立在BeanFactory基础之上的,ApplicationContext成了提供了BeanFactory功能外,还提供了:
a)ApplicationContext继承了MessageSource接口,因此提供国际化功能
b)资源访问,如文件。
c)事件机制
d)载入多个配置文件
Bean基本配置
- id
- class
注入方式
属性注入
- value
- ref
构造注入
- name
- value
- type
- index
- ref
工厂注入
静态工厂方法
-
factory-method
<bean id=”pdao” class=:”com.gt.dao.DAOFactory” factory-method=”getPersonDAO”/>
普通工厂方法
-
factory-bean
-
factory-method
<bean id=”df” class=”com.gt.dao.DAOFactory”/> <bean id=”pdao” factory-bean=”df” factory-method=”getPersonDAO”/>
Bean的配置
scope
- singleton:单例,是容器默认的scope。
- prototype:多例,对于那些请求方不能共享的对象实例,应该将其bean定义的scope设置为prototype。
- request:请求,一个请求创建一个新的实例。
- session:会话,一个会话创建一个新的实例。
- global session:global session只有应用在基于portlet的Web应用程序中才有意义,它映射到portlet的global范围的session。
设置属性
-
value
-
ref
-
bean
如果某个Bean所依赖的Bean不想被Spring容器其他Bean直接访问,可以使用嵌套Bean。
使用<bean…/>元素来定义个嵌套Bean,这个Bean只对嵌套它外部的Bean有效。
嵌套Bean无须指定id属性。
-
集合
-
list和array
使用<list>标签,在list中可以用value,ref,bean。
-
set
使用<set>标签,在list中可以用value,ref,bean。
-
map
<map> <entry> <key> <value>xxx_key</value> </key> <value>xxx_value</value> </entry> <map> 无论在key还是对应的value中都可以使用value,ref,bean。 还可以这样写:<entry key=" xxx_key " value=" xxx_value"></entry> 还可以这样:<entry key-ref=" xxx_key " value-ref=" xxx_valuen"></entry>
-
Propertis
<props> <property key="xx">yy</property> </props> 注意:只能为Sting类型。
-
其他属性
-
lazy-init:懒初始化
BeanFactory对于单例的Bean不会自动初始化,只有调用时才会初始化。
而ApplicationContext则与之相反,会在ApplicationContext初始化时,就初始化那些单例的Bean。虽然花费时间较多,但是在应用前就会发现配置错误。
如果有些单例的Bean不希望马上初始化的话,就可以在配置时设置Bean的lazy-init属性为true就可。ApplicationContext就不会初始化这个Bean了。
-
autowrie:自动装配
- no:默认,即不进行自动装配。
- byName:按照beanName进行自动装配,使用setter注入。
- byType:按照bean类型进行自动装配,使用setter注入。
- constructor:与byType差不多,不过最终属性通过构造函数进行注入。
Spring引入Autowire(自动装配)机制就是为了解决标签下标签过多的问题,引入自动装配机制,简化开发者配置难度,降低xml文件配置大小。
-
抽象和继承
- abstract
- parent
如果Spring中的bean有很多的共有属性,这时可以考虑使用一个抽象的Bean来作为模板,让其他的Bean来继承。
子Bean可以从父Bean继承实现类、构造函数、属性值等配置信息,而子Bean配置可以覆盖Bean的定义。
子Bean无法继承的属性有:
depends-on
autowire
dependency-check
scope
lazy-init。
-
depends-on
Spring总是先初始化主Bean,再初始化依赖Bean。
一般情况下,Bean之间的依赖关系很明显,但如果Bean之间的依赖关系不够直接时,我们可以用主Bean配置中depends-on属性来指明依赖Bean的id。可以指定一个或多个。
注解
-
<context:component-scan />:让Spring扫描某个包下的类,默认包含子包。
指定多个包:
-使用多个scan(推荐)
-使用一个scan,逗号分隔包
-使用一个scan,使用父包
-
@Component:被@Component注解类泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
-
@Repository:被@Repository注解的类表示DAO层实现,从而见到该注解就想到DAO层实现。
-
@Service:被@Service注解的类表示Service层实现,从而见到该注解就想到Service层实现。
-
@Controller:被@Controller注解的类表示Web层实现,从而见到该注解就想到Web层实现
-
@Value
-
@Autowired:对象属性注入,默认是根据类型注入,required属性。
-
@Qualifier:限定描述符,用于细粒度选择候选者。
eg:
@Autowired
@Qualifier(“userDaoImpl”)
其他:
- @Scope
- @Lazy
- @DependsOn
多配置文件
- 参数使用数组
- 在配置文件中使用import
- 在加载时使用通配符*