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());
}
}
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());
}
}