Spring bean的装配方式

文档:

关于Spring IOC (DI-依赖注入)你需要知道的一切https://blog.csdn.net/javazejian/article/details/54561302

 

  • bean
  1. 什么是bean

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.

在Spring中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。 bean是一个由Spring IoC容器实例化,组装和管理的对象。 否则,bean只是应用程序中许多对象之一。 Bean及其之间的依赖关系反映在容器使用的配置元数据中

https://www.awaimai.com/2596.html

bean是一个Java对象,编写规范:

  1. 所有属性为private
  2. 提供默认构造方法
  3. 提供getter和setter
  4. 实现serializable接口

声明bean

bean装配的三种方式

  • 在xml中显示配置
  • 在Java中显示配置
  • 隐式的bean发现机制和自动装配

1.通过xml声明bean

<bean id='beanA' class='com.zcb.beanA' />

id:为每个bean设置名字,class:类路径

 

  • bean注入:构造器注入,setter注入

构造器注入:有两种配置方案可选择

  • <constructor-arg>元素
  • 使用Spring3.0所引入的c-命名空间
<bean id="beanB" class="..."> <constructor-arg ref="beanA"/> </bean>

使用ref注入属性。将id为beanA的引用传递到beanB的构造器中

 

将子面值注入构造器中

public class BeanB {
    private String testa; 
    private String testb; 
    public BeanB(String testa, String testb) { 
        this.testa = testa; this.testb = testb; 
} 
}

 

<bean id="beanB" class="..."> <constructor-arg value="testa"/> <constructor-arg value="testb"/> </bean>

使用value属性将字面值注入到构造器中

装配集合

<constructor-arg> 
<list>/<set> 
<value>test1</value> 
<value>test2</value> 
<value>test3</value> 
... 
</list>/</set> 
</constructor-arg>

 

setter注入

public class TestService {
 private TestDao testDao; 
 @Autowired public void setTestDao(TestDao testDao) {
     this.testDao = testDao; 
} }

现在TestService没有显示声明任何构造器,因此可以使用如下方式为其声明bean

<bean id="testService" class="..."> <property name="testDao" ref="testDao"> </bean>

本例中它引用了testDao的bean,通过ref属性。并将其注入到testDao中(set方法)

将字面值注入到属性中,通过value属性

<property name="testa" value="testa value" /> 
<property name="testb" value="testb value" />
<property name="list"> 
    <list> 
    <value>value1</value> 
    <value>value1</value>
     ... 
    </list> 
</property>

2.通过Java代码装配bean

@Configuration注解,这个注解表明这个类是一个配置类

@Configuration 
public class Config { }

要在JavaConfig中声明bean,需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解。

@Bean 
public CompactDisc sgt() { 
    return new CompactDist(); 
}

默认情况下bean的id与@Bean注解的方法名是一样的,可以通过name属性指定一个名字。

借助JavaConfig实现注入

引用创建bean的方法或者

@Bean 
public CdPlayer cdPlayer(CompactDisc compactdisc) { 
    return new CdPlayer(compactdisc); 
}

它会自动装配一个CpmpactDisc到配置方法中

3.自动化配置

组件从两个方面实现自动化配置

  • 组件扫描
  • 自动装配

创建可被发现的bean

@Component 
public class SgtPeppers { ... }

@Component注解表明该类会作为组件类,并告知Spring要为这个类创建bean

组件扫描默认是不启用的,需要显示配置,让其去寻找带有@Component注解的类,为其创建bean。

@ComponentScan注解启用组件扫描,默认扫描与配置类相同的包。basePackages属性设置基础包,@ComponentScan(basePackages="soundSystem"),可设置数组@ComponentScan(basePackages={"soun","ddd"})

通过xml启用组件扫描

<context:component-scan base-package=".."/>

 

bean命名

@Component("lonely")显示指定名称,或者使用Java依赖注入规范中所提供的@Named注解@Named("lonely"),多数情况下两者可相互替换。

 

自动装配

使用@Autowired注解

构造器注入

@Component 
public class CdPlayer{ 
private Compact cd; 
@Autowired 
public CdPlayer(Compact cd) { 
    this.cd = cd; 
} }

setter注入

@Autowired 
public void setCompact(Compact cd) { 
    this.cd = cd; 
}

@Autowired可以用在构造器上,属性的setter方法,成员变量上。

@Autowired 
private Compact cd;

Java依赖注入规范@Inject与@Autowired有细微的差别。

 

4.bean的作用域

  • 单例(Singleton):整个应用中,只创建一个bean实例。
  • 原型(Prototype):每次注入或通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
  • 会话(Session):每个会话创建一个bean实例。
  • 请求(Request):每个请求创建一个bean实例。

@Scope设置作用域,@Scope(“prototype”)。spring默认以单例(singleton)的形式创建的。

 

5.Spring profile

bean中配置profile,profile被激活时bean才会创建。

@Profile("dev") //设置相应环境 @ActiveProfiles("dev") //激活dev

xml中配置

<beans profile="dev"></beans>

 

spring.profiles.active和spring.profeles.default //没有设置active会查找 default的值。

6.条件化bean

@Conditional注解,它可以用到带有@Bean注解的方法上,如果给定的条件计算为true,则创建bean。设置给@Conditional的类可以是任意实现了Condition接口的类型。

 

7.处理自动装配的歧义性

  • 首选bean(@Primary)

@Primary与@Component组合用在组件扫描的bean上,也可以与@Bean使用。声明bean是首选的 @Component/@Bean @Primary <bean primary="true"/>

  • 限定符(@Qualifier)

与@Autowired和@Inject协同使用 @Autowired @Qualifier("iceCream")

注:Java不允许在同一个条目上重复出现相同类型的多个注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值