Spring(3): Bean
来源:互联网 发布:mac的safari无法退出 编辑:程序博客网 时间:2024/05/18 01:17
1. Spring的三种bean装配机制
- 在XML中进行显式配置;
- 在Java中进行显式配置
- 隐式的bean发现机制和自动装配。
1.1 自动化装配bean
Spring从两个角度来实现自动化装配:
组件扫描(component scanning):Srping会自动发现应用上下文中所创建的bean。
自动装配(autowiring):Spring自动满足bean之间的依赖。
代码:
1.1.1 创建2个接口及其实现类
Interface:CompactDisc
public interface CompactDisc { void play();}
Interface:MediaPlayer
public interface MediaPlayer { void play();}
Class:Roar
@Componentpublic class Roar implements CompactDisc { public void play() { String title = "Roar"; String artist = "Katy Perry"; System.out.println("Playing " + title + " by " + artist); }}
Class:CDPlayer
@Componentpublic class CDPlayer implements MediaPlayer { private CompactDisc cd; /** * 1.构造器注入 */ // @Autowired // public CDPlayer(CompactDisc cd) { // this.cd = cd; // } /** * 2.设值注入 */ @Autowired public void setCd(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); }}
说明:
@Component:表明该类为组件类,并告知Spring为该类创建bean。
@Autowired:Spring会进行自动装配。
bean注入的两种形式:
①构造器注入:当Spring创建CDPlayer bean的时候,通过构造器来进行实例化并且会传入一个可设置给CompactDisc类型的bean。
②Setter设值注入:当Spring创建CDPlayer bean的时候,通过类方法setCd()来进行实例化并且会传入一个可设置给CompactDisc类型的bean。
1.1.2 bean的自动装配
@Configuration@ComponentScan(basePackageClasses = {CompactDisc.class})public class BeanAutoConfig {}
说明:
@ComponentScan:默认会扫描与配置类相同的包。通过basePackageClasses可以设置类所在的包作为组件扫描的基础包。
1.1.3 创建测试类Test
@RunWith(SpringRunner.class)@SpringBootTest@ContextConfiguration(classes = BeanAutoConfig.class)public class CDPlayerTest { @Autowired private CompactDisc cd; @Autowired private MediaPlayer mediaPlayer; @Test public void cdShouldNotBeNull() { assertNotNull(cd); } @Test public void testPlay() { mediaPlayer.play(); }}
说明:
@ContextConfiguration:引入配置文件。
1.2 通过Java配置装配bean
Java配置的核心就是@Configuration注解的类和@Bean注解的方法。
@Configuration:表示该类为Bean的配置类,注解的类表示它的主要目的是作为bean定义的来源。
@Bean:注解用来指定一个方法实例,配置和初始化一个新对象交给Spring IOC容器管理。
代码:
1.2.1 基于Java配置的config类
@Configurationpublic class BeanJavaConfig { @Bean public CompactDisc compactDisc() { return new Roar(); } /** * 1.构造器注入 */ // @Bean // public CDPlayer cdPlayer(CompactDisc compactDisc) { // return new CDPlayer(compactDisc); // } /** * 2.Setter设值注入 */ @Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { CDPlayer cdPlayer = new CDPlayer(); cdPlayer.setCd(compactDisc); return cdPlayer; }}
说明:
@Bean:告诉Spring这个方法将会返回一个对象,并注册该对象为Spring应用上下文中的bean。
1.2.2 测试Test类
@RunWith(SpringRunner.class)@SpringBootTest@ContextConfiguration(classes = BeanJavaConfig.class)public class CDPlayerJavaTest { @Autowired private CDPlayer player; @Test public void testPlay() { player.play(); }}
1.3 通过XML配置装配Bean
在XML文件中通过元素声明一个bean。
1.3.1 构造器注入初始化bean
(一)构造器注入bean引用 <constructor-arg>
:构造器注入初始化bean。 ref
:表明正在装配的是一个引用。
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="compactDisc" class="com.chen.beanXML.Roar"/> <!--构造器注入bean--> <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer"> <constructor-arg ref="compactDisc"/> </bean></beans>
(二)将字面量注入到构造器中 value
:表明给定的值要以字面量的形式注入到构造器中。
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--将字面量注入构造器--> <bean id="compactDisc" class="com.chen.beanXML.BlankDisc"> <constructor-arg value="Bleeding Love"/> <constructor-arg value="Leona Lewis"/> </bean> <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer"> <constructor-arg ref="compactDisc"/> </bean></beans>
(三)装配集合 value
:表明给定的值要以字面量的形式注入到构造器中。 <list>
:是元素<constructor-arg>
的子元素,表明一个包含值得列表将会传递到构造器中。
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--装配集合--> <bean id="compactDisc" class="com.chen.beanXML.BlankDisc"> <constructor-arg value="Bleeding Love"/> <constructor-arg value="Leona Lewis"/> <constructor-arg> <list> <value>Bleeding Love</value> <value>Forgiveness</value> <value>A Moment Like This</value> </list> </constructor-arg> </bean> <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer"> <constructor-arg ref="compactDisc"/> </bean></beans>
测试Test类代码:
@RunWith(SpringRunner.class)@SpringBootTest@ContextConfigurationpublic class CDPlayerXMLByArgTest { @Test public void play() { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); CDPlayer player = ctx.getBean(CDPlayer.class); player.play(); }}
1.3.2 设置属性注入bean
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="compactDisc" class="com.chen.beanXML.BlankDisc"> <property name="title" value="Bleeding Love"/> <property name="artist" value="Leona Lewis"/> <property name="tracks"> <list> <value>Bleeding Love</value> <value>Forgiveness</value> <value>A Moment Like This</value> </list> </property> </bean> <!--设置属性注入bean--> <bean id="cdPlayer" class="com.chen.beanXML.CDPlayer"> <property name="cd" ref="compactDisc"/> </bean></beans>
2. Bean属性
- id/name:唯一标识。
- class:具体实例化的类。
- scope:作用域。
- constructor-arg:用来注入依赖关系。
- properties:用来注入依赖关系。
- autowiring mode:用来注入依赖关系。
- lazy-initialization mode:延迟初始化的bean告诉IoC容器在它第一次被请求时,而不是在启动时去创建一个bean实例。
- initialization:在bean的所有必需的属性被容器设置后,调用回调方法。
- destruction:当包含该bean的容器被销毁时,使用回调方法。
3. Bean的作用域
- 单例(singleton):一个Bean容器中只存在一份(默认)。
- 原型(prototype):每次请求创建新的实例,destory方式不生效。
- 请求(request):该作用域将 bean 的定义限制为 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效,每次http请求创建一个实例且仅在当前request内有效。
- 会话(session):该作用域将 bean 的定义限制为 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。
- 全局会话(global-session):该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。
源代码:
https://github.com/leifchen/hello-spring
自动装配 bean 代码包:com.chen.beanauto
通过 Java 配置装配 bean 代码包:com.chen.beanjava
通过 XML 配置装配 Bean 代码包:com.chen.beanxml
- Spring(3): Bean
- spring(3) 引用其他bean
- Spring-3 自动装配bean
- java bean,spring bean
- Spring Bean
- spring bean
- spring bean
- Spring bean
- spring & bean
- Spring Bean
- spring bean
- Spring Bean
- Spring bean
- Spring bean
- Spring Bean
- Spring Bean
- Spring bean
- Spring Bean
- 【Linux】中的管道实现
- Java并发与多线程图文教程
- Java开发中文乱码的几种解决方法
- angular.element方法汇总
- (译)XposedHelpers
- Spring(3): Bean
- 使用recycleview实现item多布局踩的坑
- 设计模式、框架、架构、平台的区别
- html5<canvas转换之万花筒>
- ecshop指定分类文章和产品调用
- 学习kotlin第六天_包、控制流、返回和跳转
- FFT后的物理意义
- 算法思路交流
- 第一篇 微信商城 开发前的准备工作