-
依赖注入
对象的依赖关系由系统中负责协调各个对象的__第三方组件(Spring)__在创建时进行设定。一个对象只通过接口来表明依赖关系,对象会在运行期被赋予它们所依赖的对象,而不需要主动获得
-
装配
(1) 定义
创建应用对象之间的协作关系
(2) 装配机制
1 自动
2 Java Config 配置类
3 Xml
(3) 优先级
自动 > Java Config > Xml 配置, 现实条件不允许时再使用后面的方式
-
自动配置 = 自动扫描 + 自动装配
(1) 自动扫描
@Component 注解会告知 Spring 为当前类创建 bean
示例
import org.springframework.stereotype.Component; @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Club Band"; private String artist = "The Beatles"; public void play() { System.out.println("Playing " + title + " by " + artist); } }
@ComponentScan会进行自动扫描(默认扫描当前包下的bean,也可以进行配置)
示例
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { }
自动扫描也可以在Xml中通过配置实现
示例
<?xml version="1.0" encoding="UTF-8"?> <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" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p" 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="soundsystem" /> </beans>
@Configuration 代表该类是一个配置类
(2) 自动装配
@Autowired可以进行自动装配,并且__可以用在类的任何方法上__,只要该方法存在不同对象的依赖关系
示例
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); } }
-
Java Config 配置
(1) Java Config类__一般放在单独的包中,不包含任何业务逻辑__
(2) 使用 @Configuration 代表该类是一个配置类
示例
@Configuration public class CDPlayerConfig { .... }
(3) 在JavaConfig中声明Bean,需要编写一个方法,创建接口对应的实例,然后给这个方法添加@Bean注解
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public CompactDisc compactDisc() { return new SgtPeppers(); } @Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); } }
(4) 默认情况下,Spring中的Bean都是单例的。也就是说下面的例子中,Spring会拦截对 sgtPeppers()的调用并确保返回的是Spring所创建的bean
示例
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); } @Bean public CDPlayer anotherCDPlayer() { return new CDPlayer(sgtPeppers()); }
(5) 带有@Bean注解的方法可以采用任何必要的Java功能来产生示例,未必是构造器依赖注入
示例
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { CDPlayer cdPlayer = new CDPlayer(); cdPlayer.setCompactDisc(compactDisc); return cdPlayer; }
-
Xml装配Bean
(1) 配置规范 + 根元素
示例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ... </beans>
(2) 声明bean:
示例
<bean class="soundsystem.SgtPeppers" id="compactDisc"/>
(3) 构造器注入:
1 引用其他对象: ref属性
示例
<bean id="cdPlayer" class="soundsystem.CDPlayer"> <constuctor-arg ref="compactDisc"/> </bean>
2 字面量: value属性(按照构造器的参数顺序对应)
示例
<bean class="soundsystem.BlankDisc" id="blackDisc"> <constructor-arg value="Chara"/> <constructor-arg value="Glico"/> </bean>
3 集合:
<list>元素, <set>元素
(4) 设置属性(类似于 setXXX方法): ,内含 name属性,代表 setXXX部分的XXX,但是首字母小写
1 引用其他对象: ref属性
示例
<bean id="cdPlayer" class="soundsystem.CDPlayer"> <property name="compactDisc" ref="compactDisc"/> </bean>
2 字面量: value属性(按照构造器的参数顺序对应)
示例
<bean class="soundsystem.BlankDisc" id="blackDisc"> <property name="artist" value="Chara"/> </bean>
3 集合:
<list>元素, <set>元素
(5) 原则:强相关使用构造器,弱相关使用setXXX()方法
-
混合装配
(1) Java Config 中引用 xml: @ImportResource
示例 (classpath是 src/main/resources)
@ImportResource("classpath:cd-config.xml")
(2) Java Config 中引用其他 Java Config: @Import
示例
@Configuration @Import(CDConfig.class, CDPlayerConfig.class) public class SystemConfig { }
所以,可以创建一个 Java Config汇总配置类,这样导入时只需要导入这个类
(3) xml 中引用 Java Config: 使用 元素
示例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="compactDisc" class="soundsystem.BlankDisc" c:_0="Sgt. Pepper's Lonely Hearts Club Band" c:_1="The Beatles"> <constructor-arg> <list> <value>Sgt. Pepper's Lonely Hearts Club Band</value> <value>With a Little Help from My Friends</value> <value>Lucy in the Sky with Diamonds</value> <value>Getting Better</value> <value>Fixing a Hole</value> </list> </constructor-arg> </bean> </beans>
(4) xml 中引用其他 xml配置:
示例 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="otherSource.xml"/> </beans>
-
测试时,需要在 src/test/java 下创建 测试文件。
调用Java Config配置类使用 @ContextConfiguration(classes = xxx.class)
调用xml配置时使用 @ContextConfiguration(locations = “classpath:META-INF/spring/soundsystem.xml”)
或者是 手动地添加应用上下文如 AnnotationConfigApplicationContext、ClassPathXmlApplicationContext等,详见"Spring容器.md"
-
无论使用哪种配置,一般都要创建一个根配置,将所有的JavaConfig(自动方式也有一个JavaConfig类)和XML组合起来,然后这个根配置启动 @ComponentScan
chapter02_装配Bean_1_装配Bean
猜你喜欢
转载自blog.csdn.net/captxb/article/details/87862601
今日推荐
周排行