spring的自动装配

POJO:实际上就是简单的javabean,是为了避免与ejb的混淆,其中有一些属性及其getter setter方法的类,没有业务逻辑


spring的自动装配(autowiring)有四种策略:byName byType constructor autodetect


①byName:根据要匹配到bean的属性中的那个属性名到xml文件中查找bean的id与之匹配的bean,如果找到,就把该bean装配到该属性中
<bean id="simple" class=""/>

person  bean中属性必须要有一个simple名字,以便自动装


<bean id="person" class="" autowire="byName"/>


这样就会把simple那个bean装配到person中的属性中



②byType:根据bean的属性类型到上下文中查找与之对应的类型,如果找到,则装配;如果在上下文中存在多种此类型的bean则会抛出异常

解决之道:两种:
①如果有多个bean,可以在候选bean中设置此属性(此属性是设置候选bean的首选项,默认为true,因此如果要指定装配哪个,就需要把其他的设置为false):primary=false,只留一个primary=true,bean的该属性默认值为true


②上面的解决办法很麻烦:在自动装配的时候,我们希望排除某些bean,那可以设置这些bean的autowire-candidate属性为false,这样这些bean就失去了候选资格


③constructor:通过构造器注入bean;此方法与byType有相同的局限性,如果找到多个与之匹配的bean类型或者有多个构造器能使用自动装配,它就不会自动选择,而会抛出异常


④autodected:最佳自动装配方式:首先会使用constructor进行自动装配,如果不匹配则会使用byType进行装配


默认自动装配:如果需要为上下文中的每个bean或者大多数配置相同的autowire属性很麻烦,可以直接在<beans default-autowire="">元素上加上属性:default-autowire=“装配方式”




注解装配:

①spring默认是禁止自动装配的,如果要使用,需要早xml文件中使用context命名空间开启:

<context:annotation-config/>告诉spring我们打算使用注解进行自动装配




②@autowire注解可以加在任何地方:属性,方法,构造器 该注解按照byType来匹配

使用该注解要注意,如果它匹配不到,则会抛出异常;解决之道:加上·参数:@autowire(required=false) 如果匹配不到,则会赋值为null


此注解如果加在构造器上,如果有多个构造器,他会匹配所有参数都匹配且参数最多的那个构造器


③当有多个bean符合条件,能被装配到属性中,它就不知道要装配哪一个,会抛出异常,我们可以指定具体装配哪一个bean

第一种:@Qualifier("BeanId")

第二种:在引用的那个bean中配置:


<bean id="" class="">
<qualifier value="Stringed"/>
</bean>

第三种:在引用的那个bean的类上面加上:@Qualifier("Stringed")



spring提供了标准的java注解来替代autowire注解;   使用java依赖注解中的@Inject;该注解与autowire有相同的功能,只不过它没有require属性,所以当它找不到与之匹配的bean,则会抛出异常




@Named与spring中的@Qualifier类似




spring还支持自动装配属性的类型为基本类型的数据:@value("表达式")


为了配置spring的自动检测,需要使用<context:component-scan base-package="要自动扫描的包">元素来代替<context:annotation-config>元素






如果有一个接口,有多个实现类,而有需要把每个实现类变成spring的bean,则需要一个一个加上注解,很麻烦:解决之道:


<context:component-scan base-package="要自动扫描的包">
<context:include-filter type="assignable" expression="接口权限定名">
</context:component-scan>
这种方式就会把所有实现这个接口的类都自动注册为spring的 bean




指定哪些类不需要自动注册为spring的bean


<context:component-scan base-package="要自动扫描的包">
<context:exclude-filter type="assignable" expression="接口权限定名">
</context:component-scan>




@Resource   Person  person  可以直接把Person类型的bean注入到此属性中




spring基于java的配置:

①@Configuration注解会作为一个标识告诉spring,这个类将包含多个spring  bean的定义,这些bean的定义是使用@Bean注解所标注的方法:例如:

@Bean
public  Person  getPerson(){
return  new  Dog();
}
此方法将注册一个spring 的bean  bean的id为方法的名字


@Bean
public Food getFood(){
return new Food(getPerson())
}
该方法将注册一个Spring的bean,此bean要依赖注入一个person对象,当调用getPerson()的时候,并不会马上创建一个新的person对象,而会到spring的上下文中去查找有没有这个bean








/**
 * 当使用@Bean的时候,返回的bean不能new本类。必须new其他的类
 * @author simple
 *
 */
@Configuration
public class Dog implements Animal {


@Bean
public Food food() {

Food food = new Food();

food.setFoodName("肉");

return food;


}


@Test
public void test(){

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Dog.class);
ctx.refresh();
Food food = (Food) ctx.getBean("food");
System.out.println(food.getFoodName());

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值