目录
一、配置
1、基于XML的配置
适用场景:Bean实现类来自第三方类库,如:DataSource等
<beans>
<import resource=“resource1.xml” />//导入其他配置文件Bean的定义
<import resource=“resource2.xml” />
<bean id="userService" class="cn.lovepi.***.UserService" init-method="init" destory-method="destory">
</bean>
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="test"></constructor-arg>
</bean>
</beans>
2、基于注解的配置
适用场景:项目中自己开发使用的类,如controller、service、dao等
步骤如下:
1)在applicationContext.xml配置扫描包路径
<context:component-scan base-package="com.lovepi.spring">
//包含的目标类
<context:include-filter type="regex" expression="com.lovepi.spring.*"/>
//排除的目标类
<context:exclude-filter type="aspectj" expression="cn.lovepi..*Controller+"/>
</context:component-scan>
2)使用注解声明bean
Spring提供了四个注解,这些注解的作用与上面的XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),可以自己修改:
- @Component:当对组件的层次难以定位的时候使用这个注解
- @Controller:表示控制层的组件
- @Service:表示业务逻辑层的组件
- @Repository:表示数据访问层的组件
@Service
public class SysUserService {
@Resource
private SysUserMapper sysUserMapper;
public int insertSelective(SysUser record){
return sysUserMapper.insertSelective(record);
}
}
3、基于Java类的配置
适用场景:需要通过代码控制对象创建逻辑的场景,好处是实现零配置,消除xml配置文件
步骤如下:
- 使用@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;
}
}
public class Main {
public static void main(String args[]){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfiguration.class);
Student student = (Student) context.getBean("student");
Teacher teacher = (Teacher) context.getBean("teacher");
System.out.println("学生的姓名:" + student.getName() + "。老师是" + student.getTeacher().getName());
System.out.println("老师的姓名:" + teacher.getName());
}
}
二、解析
1、基于XML配置的解析
- BeanDefinitionReader:Bean 相关信息配置完成之后,需要解析资源,BeanDefinitionReader 接口定义了一系列方法来解析和辅助解析资源,XmlBeanDefinitionReader 和 PropertiesBeanDefinitionReader 都是 BeanDefinitionReader 的实现类,用来解析特定资源的。
- BeanDefinitionParser:XML 解析器
2、基于注解配置的解析
- AnnotatedBeanDefinitionReader
AnnotatedBeanDefinitionReader 与 XmlBeanDefinitionReader 和 PropertiesBeanDefinitionReader 不同,它没有实现 BeanDefinitionReader 接口,并且 AnnotatedBeanDefinitionReader 这个类注册和解析在同一类中。这里需要注意一下,虽然这个类可以解析配置类,但是在这个阶段并不能解析 @Bean 等配置 Bean 的注解,@Bean 等配置类的注解是在 AbstractApplication 中 refresh 方法中处理的。也就是说 AnnotaedBeanDefinitionReader 是发现 Configclass 的,而 @Bean 注解是在 解析Configclass 内部进行处理的。
public class AnnotationBeanDefinitionParserDemo {
public static void main(String[] args) {
// 创建一个 Bean 工厂
DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
// 创建一个 AnnotatedBeanDefinitionReader
AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader = new AnnotatedBeanDefinitionReader(defaultListableBeanFactory);
// 添加一个注册类
annotatedBeanDefinitionReader.register(AnnotationBeanDefinitionParserDemo.class);
// 通过依赖查找获取 Bean 实例
AnnotationBeanDefinitionParserDemo bean = defaultListableBeanFactory.getBean(AnnotationBeanDefinitionParserDemo.class);
System.out.println("通过 AnnotatedBeanDefinitionReader 元信息配置方式获取 bean 实例:" + bean);
}
}
三、注册
spring在启动时会自己把bean(java组件)注册到ioc容器里,实现控制反转,在开发人员使用spring开发应用程序时,你是看不到new关键字的,所有对象都应该从容器里获得,它们的生命周期在放入容器时已经确定!最原始的创建对象的方法就是通过new来实现(手动的编写代码实现):而Spring提供了Ioc容器用于对象的创建以及配置、管理、销毁等。
package com.rumenz;
public class DemoApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext();
registerBean(ac,"rumenz");
//启动Spring上下文
ac.refresh();
//依赖查找
Rumenz rumenz = (Rumenz) ac.getBean("rumenz");
rumenz.print();
//关闭Spring上下文
ac.close();
}
private static void registerBean(BeanDefinitionRegistry reg, String beanName){
BeanDefinitionBuilder bd=BeanDefinitionBuilder.genericBeanDefinition(Rumenz.class);
reg.registerBeanDefinition(beanName,bd.getBeanDefinition());
}
}
本文介绍了Spring框架下三种主要的Bean配置方式:基于XML、基于注解和基于Java类的配置,并探讨了Bean的解析与注册过程。
1931

被折叠的 条评论
为什么被折叠?



