Spring实战-读书笔记(章节一、二)-Spring框架的目的以及装配Bean
2017-11-12 10:51
435 查看
Spring框架的目的
spring框架的目的和意义:让java开发变得简单。spring提供四种核心策略实现这个目的:
1、不侵入POJO
2、使用依赖注入(DI)来实现对象之间保持松散耦合
3、使用面向切面(AOP)来确保POJO的简单性(不侵入POJO)
4、使用模板代码来消除样板代码(类如JdbcTemplet类,将JDBC API封装简化数据库的放问,将业务代码和JDBC代码分离)
装配Bean
Spring中装配Bean有三种方式:隐士的发现和装配Bean(自动装配)、javaConfig显式配置、XML配置文件显式配置,Spring容器的Bean都来自此三种方式。自动装配
使用自动装配功能可分为三个步骤
开启自动扫描组件功能,配置一个或多个包名扫描指定包下类标记@Component注解,Spring会将此类作为容器中的Bean
在依赖的字段、方法或构造方法上使用@Autowired注解标记
涉及的注解
对应第一个步骤:@ComponentScan:表示启用组件扫描,默认会扫描配置类所在的包以及子包下的类,可以通过basePackPages指定多个包明。
@Configuraction:标记一个类为spring配置类。
对应第二个步骤:
@Component:标记的类作为组件类,spring会为此类创建一个bean,不指定bean名称spring会默认将类的首字母小写作为bean名称。
@Named:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
对应第三个步骤:
@Autowired:标记在构造函数、set方法、字段上告诉spring自动装配策略注入依赖bean。
@Inject:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
自动装配规则(仅供参考)
//spring自动装配策略规则://1,首先,检测到依赖类型仅仅有一个实现Bean,使用这个Bean注入
//2,其次,将字段名称、方法和构造函数上的形参名称作为bean id去匹配对应的Bean,使用这个Bean注入
代码事例
package com.zhangxy.chapter_2.autoconfig.main; public interface CDPlayer { void paly(); }
package com.zhangxy.chapter_2.autoconfig.main; public interface CompactDisc { void paly(); }
package com.zhangxy.chapter_2.autoconfig.main; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MediaPlayer implements CDPlayer { private CompactDisc compactDisc; @Autowired public MediaPlayer(CompactDisc compactDisc) { this.compactDisc = compactDisc; } @Override public void paly() { System.out.println("MediaPlayer start paly"); } }
package com.zhangxy.chapter_2.autoconfig.main; import org.springframework.stereotype.Component; @Component public class SgtPeppers implements CompactDisc { @Override public void paly() { System.out.println("SgtPeppers start paly"); } }
package com.zhangxy.chapter_2.autoconfig.main; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages= {"com.zhangxy.chapter_2.autoconfig.main"}) public class CDPlayerConfig { }~~~~测试类~~~~:
package com.zhangxy.chapter_2.autoconfig.test; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.zhangxy.chapter_2.autoconfig.main.CDPlayer; import com.zhangxy.chapter_2.autoconfig.main.CDPlayerConfig; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes= {CDPlayerConfig.class}) public class CDPlayerTest { @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Autowired private CDPlayer cdPlayer; @Test public void test() { cdPlayer.paly(); assertEquals("MediaPlayer start paly\r\n" + "", log.getLog()); } }
javaConfig显式配置
javaConfig显式配置通过java代码来配置Bean。此方式的配置主要是通过代码去理解。涉及注解
@Bean:标记在一个方法告诉spring方法的返回对象将最为spring上下文中的bean,可以通过name属性可以指定Bean的名称,默认的已方法名作为bean名称。代码事例
package com.zhangxy.chapter_2.javaconfig.main; public interface CDPlayer { void paly(); }
package com.zhangxy.chapter_2.javaconfig.main; public interface CompactDisc { void paly(); }
package com.zhangxy.chapter_2.javaconfig.main; public class MediaPlayer implements CDPlayer { private CompactDisc compactDisc; public MediaPlayer(CompactDisc compactDisc) { this.compactDisc = compactDisc; } @Override public void paly() { System.out.println("MediaPlayer start paly"); } }
package com.zhangxy.chapter_2.javaconfig.main; public class SgtPeppers implements CompactDisc { @Override public void paly() { System.out.println("SgtPeppers start paly"); } }~~~~测试~~~~
package com.zhangxy.chapter_2.javaconfig.test; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.zhangxy.chapter_2.javaconfig.main.CDPlayer; import com.zhangxy.chapter_2.javaconfig.main.CDPlayerConfig; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes= {CDPlayerConfig.class}) public class CDPlayerTest { @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Autowired private CDPlayer cdPlayer; @Test public void test() { cdPlayer.paly(); assertEquals("MediaPlayer start paly\r\n" + "", log.getLog()); } }注意:MediaPlayer和SgtPeppers没有标记@Component注解,CDPlayerConfig类也没有使用@ComponentScan注解开启自动扫描组件。
XML配置文件显示配置
XML配置文件显示配置是通过XML来配置Bean。此方式主要是通过XML配置去理解。以上两种方式都是通过在字段、set方法和构造函数上使用注解@AutoWired来注入依赖的Bean。在XML中如何注入依赖的Bean呢???通过构造函数来注入依赖的bean
a,构造函数引用类型注入<constructor-arg ref="bean id"/>
<c:形参名称-ref="bean id"/>
<c:_0-ref="bean id"/>
b,构造函数字面量注入
<constructor-arg value="ABC">
<c:形参名称="ABC"/>
<c:_0="ABC"/>
c,构造函数集合类型注入
c.1,String类型集合
<constructor-arg>
<list>
<value>ABC</value>
<value>ABC</value>
</list>
</constructor-arg>
c.2,引用类型集合
<constructor-arg>
<list>
<ref bean="bean id"/>
<ref bean="bean id"/>
</list>
</constructor-arg>
以上元素都是<bean>元素的子元素。
属性注入
a,属性引用类型注入<property name="属性名称" ref="bean id"/>
<p:属性名称-ref="bean id"/>
b,属性字面量注入
<property name="属性名称" ref="ABC"/>
<p:属性名称="ABC"/>
事例代码
参照下一个章节事例代码。javaConfig、XML配置文件互相引用
我们可以通过javaConfig方式配置一部分Bean,在通过XML配置方法配置一部分Bean,那我们如何在javaConfig配置中引用XML配置的Bean???如果在XML配置中引用javaConfig的Bean???开启组件扫描产生的Bean我们在javaConfig和XML配置可以直接通过Bean id引用。javaConfig配置中引用XML配置的Bean
涉及注解
@ImportResource:引用XML配置文件,作用在javaConfig类上。@Import:应用其它javaConfig类,作用在javaConfig类上。
事例代码
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; public interface CompactDisc { void play(); }
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; public interface MediaPlayer { void play(); }
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; import org.springframework.beans.factory.annotation.Autowired; public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); } }
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; import java.util.List; public class BlankDisc implements CompactDisc { private String title; private String artist; private List<String> tracks; public BlankDisc(String title, String artist, List<String> tracks) { this.title = title; this.artist = artist; this.tracks = tracks; } public void play() { System.out.println("Playing " + title + " by " + artist); for (String track : tracks) { System.out.println("-Track: " + track); } } }
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public MediaPlayer cdPlayer(CompactDisc blankDisc) { return new CDPlayer(blankDisc); } }
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportResource; @Configuration @Import(CDPlayerConfig.class) @ImportResource("classpath:com\\zhangxy\\chapter_2\\mixedconfig\\importXmlConfig\\main\\blankDisc-config.xml") public class SystemConfig { }
<?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" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="blankDisc" class="com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main.BlankDisc"> <constructor-arg value="如果这都不算爱" /> <constructor-arg value="张学友"></constructor-arg> <constructor-arg ref="tracks"></constructor-arg> </bean> <util:list id="tracks"> <value>A</value> <value>B</value> </util:list> </beans>~~~~测试类~~~~
package com.zhangxy.chapter_2.mixedconfig.importXmlConfig.test; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main.MediaPlayer; import com.zhangxy.chapter_2.mixedconfig.importXmlConfig.main.SystemConfig; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { SystemConfig.class }) public class ImportXMLConfigTest { @Autowired private MediaPlayer mediaPlayer; @Test public void test() { mediaPlayer.play(); } }
在XML配置中引用javaConfig的Bean
将javaConfig类在XML配置文件中配置成一个Bean即可。事例代码
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; public interface CompactDisc { void play(); }
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; public interface MediaPlayer { void play(); }
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; import java.util.List; public class BlankDisc implements CompactDisc { private String title; private String artist; private List<String> tracks; public BlankDisc(String title, String artist, List<String> tracks) { this.title = title; this.artist = artist; this.tracks = tracks; } public void play() { System.out.println("Playing " + title + " by " + artist); for (String track : tracks) { System.out.println("-Track: " + track); } } }
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; public class CDPlayer implements MediaPlayer { private CompactDisc cd; public CDPlayer(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); } }
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public MediaPlayer cdPlayer(CompactDisc blankDisc) { return new CDPlayer(blankDisc); } }
package com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import(CDPlayerConfig.class) public class SystemConfig { }
<?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" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="blankDisc" class="com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main.BlankDisc"> <constructor-arg value="如果这都不算爱" /> <constructor-arg value="张学友"></constructor-arg> <constructor-arg ref="tracks"></constructor-arg> </bean> <util:list id="tracks"> <value>A</value> <value>B</value> </util:list> <bean class="com.zhangxy.chapter_2.mixedconfig.importJavaConfig.main.SystemConfig"></bean> </beans>
相关文章推荐
- spring实战三装配bean之Bean的作用域以及初始化和销毁Bean
- Spring实战-读书笔记(章节三)-高级装配
- Spring实战2:装配bean—依赖注入的本质
- Spring实战 第2章 装配Bean
- [学习笔记]spring实战-装配Bean
- Spring实战笔记2---Bean的装配
- Spring 实战-第二章-装配Bean
- spring实战-显式装配bean
- Spring实战3:装配bean的进阶知识
- Spring实战——通过Java代码装配bean
- 读书笔记-spring高级装配bean
- Spring Bean装配:Bean注解实现以及定义
- (笔记)Spring实战_最小化Spring XML配置(1)_自动装配Bean属性
- Spring4 实战笔记(1):装配bean—依赖注入的本质
- Spring实战2:装配bean—依赖注入的本质
- Spring实战-装配bean
- Spring4 实战笔记(2):装配bean的进阶知识
- spring实战一:装配bean之注入Bean属性
- spring实战二之Bean的自动装配(非注解方式)
- 学习《spring 3.x企业应用开发实战》之在IoC容器中装配Bean