Spring实战-读书笔记(章节一、二)-Spring框架的目的以及装配Bean
来源:互联网 发布:淘宝吃魔鬼辣椒视频 编辑:程序博客网 时间:2024/06/05 18:42
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配置类。
@Configuraction:标记一个类为spring配置类。
对应第二个步骤:
@Component:标记的类作为组件类,spring会为此类创建一个bean,不指定bean名称spring会默认将类的首字母小写作为bean名称。
@Named:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
@Named:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
对应第三个步骤:
@Autowired:标记在构造函数、set方法、字段上告诉spring自动装配策略注入依赖bean。
@Inject:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
@Inject:是java规范中的依赖注入注解,作用同Component,也可以被Spring识别。
自动装配规则(仅供参考)
//spring自动装配策略规则:
//1,首先,检测到依赖类型仅仅有一个实现Bean,使用这个Bean注入
//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;@Componentpublic class MediaPlayer implements CDPlayer {private CompactDisc compactDisc;@Autowiredpublic MediaPlayer(CompactDisc compactDisc) {this.compactDisc = compactDisc;}@Overridepublic void paly() {System.out.println("MediaPlayer start paly");}}
package com.zhangxy.chapter_2.autoconfig.main;import org.springframework.stereotype.Component;@Componentpublic class SgtPeppers implements CompactDisc {@Overridepublic 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 {@Rulepublic final StandardOutputStreamLog log = new StandardOutputStreamLog();@Autowiredprivate CDPlayer cdPlayer;@Testpublic 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;}@Overridepublic void paly() {System.out.println("MediaPlayer start paly");}}
package com.zhangxy.chapter_2.javaconfig.main;public class SgtPeppers implements CompactDisc {@Overridepublic 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 {@Rulepublic final StandardOutputStreamLog log = new StandardOutputStreamLog();@Autowiredprivate CDPlayer cdPlayer;@Testpublic 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>
<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;@Configurationpublic class CDPlayerConfig {@Beanpublic 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 {@Autowiredprivate MediaPlayer mediaPlayer;@Testpublic 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;@Configurationpublic class CDPlayerConfig {@Beanpublic 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>
阅读全文
1 0
- Spring实战-读书笔记(章节一、二)-Spring框架的目的以及装配Bean
- Spring实战-读书笔记(章节三)-高级装配
- spring框架详解(二)--bean的装配
- Spring实战读书笔记 第二章 装配Bean
- Spring实战之二:装配Bean
- Spring实战--(二)装配Bean
- Spring实战-装配bean
- spring实战-声明,装配Bean(一)
- spring 装配bean(二)
- Spring实战笔记2---Bean的装配
- 【Spring】Spring实战(二)——装配Bean
- 读书笔记-spring高级装配bean
- spring实战-自动装配bean
- spring实战-注解装配bean
- spring实战-JavaConfig装配bean
- spring实战-混合装配bean
- spring实战-条件装配bean
- spring实战-注解装配bean
- HBase之HFile详解
- 成为Java顶尖程序员 ,看这10本书就够了
- leetcode-453. Minimum Moves to Equal Array Elements
- ACM_整除个数
- options
- Spring实战-读书笔记(章节一、二)-Spring框架的目的以及装配Bean
- 初始化中的kmem_cache 实例
- matlab function的使用
- 【Lucene】创建第一个Lucene索引库
- 顶级会议论文研读集
- Mac上python2和python3的版本切换的简单处理方式
- IDEA Mybatis Plugin 3.21 破解方法
- PAT (Basic Level) Practise (中文)1052. 卖个萌 (20)
- [C++ 二叉树的构建与遍历] 数据结构实验之二叉树二:遍历二叉树