一、定义bean的三种方式
1、基于XML的bean定义
具体的有上一个博客提到的setter注入,构造器注入等五种方式
2、基于注解的bean定义
1、 元注解:@Component
@Target(ElementType.TYPE)
@Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
2、@Controller(控制层)
@Target(ElementType.TYPE)
@Controller对应表现层的Bean,也就是Action
3、Service(业务层)
@Target(ElementType.TYPE)
@Service对应的是业务层Bean
4、@ Repository(数据访问层)
@Target(ElementType.TYPE)
@Repository对应数据访问层Bean
使用以上注解标识User之后,就表示要把User交给Spring容器管理,在Spring容器中会存在一个名字为"user"的bean,这个名字是根据Use类名来取的(首字母小写)。
3、基于Java类的bean定义
- 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
- 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
- AnnotationConfigApplicationContext或子类进行加载基于java类的配置
@Configuration
public class BeansConfiguration {
@Bean
public Student student(){
Student student=new Student();
student.setName("张三");
student.setTeacher(teacher());
return student;
}
@Bean
public Teacher teacher(){
Teacher teacher=new Teacher();
teacher.setName("李四");
return teacher;
}
}
二、spring bean的自动装配
1、基于XML的自动装配
autowire指定自动注入的方式,具体的注入方式是上一个博客中提到的setter注入等。
default-autowire:指定默认的自动注入方式
- no:默认值。表示不进行自动注入。
- byName:根据名称进行自动注入。如beanA有一个setBeanB()方法,指定autowire=”byname”时Spring将自动在bean容器中寻找名为“beanB”的bean通过setBeanB方法自动注入给beanA。
- byType:根据类型进行自动注入。如beanA有一个setBeanB()方法,指定autowire=”byType”时Spring将自动在bean容器寻找类型为BeanB的bean通过setBeanB()方法注入给beanA。但是如果此时容器中有两个以上类型为BeanB的bean时就将抛出异常。
- constructor:等同于byType,只是当指定autowire=”constructor”时表示将通过构造方法根据类型进行自动注入。
<?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="student" class="test.Student" autowire="byName">
<property name="name" value="张三"/>
</bean>
<bean id="teacher" class="test.Teacher">
<property name="name" value="李四"/>
</bean>
</beans>
bean中的ref 属性是在一个bean中引用另一个bean
<bean class="dao.UserDaoImpl" id="userDao"/>
<bean class="service.UserServiceImpl" id="userService">
<property name="userDao" ref="userDao"/>
</bean>
2、基于注解的自动装配
使用注解来构造IoC容器
用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。
<context:component-scan base-package="annotation"/>
指定相应的包名,扫描相应的包如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。
(1)@Autowired
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
一般放在属性上
public class UserServlet {
@Autowired
UserService userService;
}
@Autowired还可以自动注入接口的全部实现类
@Autowired
List<beaninterface> list;
@Autowired
Map<String, beaninterface> map;
自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
(2)Qualifier(指定注入Bean的名称)
如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称
public class A {
@Autowired
@Qualifier("interfaceA")
beaninterface a;
}
(3)@Required
@Target(ElementType.METHOD)
@Required
public void setId(int id) {
this.id = id;
}
该@Required注解适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个 BeanInitializationException异常。
(4)@Resource
与@Autowired使用方法基本相同
@Resource的装配顺序:
(1)、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
(2)、指定了name或者type则根据指定的类型去匹配bean
(3)、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错
然后,区分一下@Autowired和@Resource两个注解的区别:
(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了