Spring框架—SpringBean配置

本文介绍了Spring框架下三种主要的Bean配置方式:基于XML、基于注解和基于Java类的配置,并探讨了Bean的解析与注册过程。

目录

一、配置

1、基于XML的配置

2、基于注解的配置

3、基于Java类的配置

二、解析

1、基于XML配置的解析

2、基于注解配置的解析

三、注册


一、配置

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配置文件

步骤如下:

  1. 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
  2. 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象
  3. 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());
    }

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值