Spring基于注解的配置详解

Spring配置

从Spring2.5开始支持基于注解的配置,使用@Configuration注解标注配置类,通过AnnotationConfigApplicationContext容器类读取注解配置信息。一个简单的例子如下,其中@Bean注解相当于配置文件中的<bean .../>

  1. 基础类代码

    public class Student {
        private Integer sId;
        private String sName;
        private String sGrade;
        private String sClass;
        private Integer sAge;
        private Integer sGender;
    
        public Integer getsId() {
            return sId;
        }
    
        public void setsId(Integer sId) {
            this.sId = sId;
        }
    
        public String getsName() {
            return sName;
        }
    
        public void setsName(String sName) {
            this.sName = sName;
        }
    
        public String getsGrade() {
            return sGrade;
        }
    
        public void setsGrade(String sGrade) {
            this.sGrade = sGrade;
        }
    
        public String getsClass() {
            return sClass;
        }
    
        public void setsClass(String sClass) {
            this.sClass = sClass;
        }
    
        public Integer getsAge() {
            return sAge;
        }
    
        public void setsAge(Integer sAge) {
            this.sAge = sAge;
        }
    
        public Integer getsGender() {
            return sGender;
        }
    
        public void setsGender(Integer sGender) {
            this.sGender = sGender;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "sId=" + sId +
                    ", sName='" + sName + '\'' +
                    ", sGrade='" + sGrade + '\'' +
                    ", sClass='" + sClass + '\'' +
                    ", sAge=" + sAge +
                    ", sGender=" + sGender +
                    '}';
        }
    }
    
  2. 配置类代码

    @Configuration
    public class SimpleConfig {
        @Bean
        public Student getStudent(){
            Student res = new Student();
    
            res.setsAge(18);
            res.setsClass("2");
            res.setsGender(1);
            res.setsGrade("小1");
            res.setsId(0);
            res.setsName("小王");
            return res;
        }
    }
    
  3. 测试代码

    public class AnnoConfigTest {
        private AnnotationConfigApplicationContext ctx;
    
        @Before
        public void doBefore(){
            ctx=new AnnotationConfigApplicationContext();
        }
    
        @After
        public void doAfter(){
            ctx.registerShutdownHook();
        }
    
        @Test
        public void test01(){
            ctx.register(SimpleConfig.class);
            ctx.refresh();
            Student student = ctx.getBean(Student.class);
            System.out.println(student);
        }
    }
    
  4. 测试结果

    Student{sId=0, sName='小王', sGrade='小1', sClass='2', sAge=18, sGender=1}
    

配置注解说明

  1. @Bean

    包括参数如下:

    参数名称参数说明默认值
    name默认参数,用于配置Bean的名称
    initMethod初始化方法,用于标注初始化后执行的方法
    destroyMethod销毁方法,用于标注类销毁前执行的方法
    autowireCandidate用于说明是否自动注入true
    表1:@Bean注解说明
  2. @Scope

    用于配置Bean的作用域,作用相当于<bean scope=""/>,默认值同样为"singleton"

  3. @Lazy

    用于配置Bean的懒加载,作用相当于<bean lazy-init="true" />,默认值为true

示例代码如下:

@Bean(name = "Simple-Bean", initMethod = "initFunc", destroyMethod = "destroyFunc")
@Scope("singleton")//设定作用域
@Lazy//懒加载
public SimpleBean getSimpleBean() {
    SimpleBean bean = new SimpleBean();
    bean.setMessage("实现初始化回调和销毁回调方法");
    return bean;
}

配置容器事件

Spring针对容器设定了四种容器事件,分别是容器刷新事件(容器创建和刷新时执行)、容器开始事件(调用start()方法时执行)、容器停止事件(调用stop()方法时执行)、容器关闭事件(调用close()方法时执行)。通过配置实现了ApplicationListener接口的类可以设定这几种事件。

新建4个类,分别实现ApplicationListener接口,代码如下:

public class ContextRefreshEvent implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("====容器刷新refresh事件执行====");
    }
}

public class ContextStartEvent implements ApplicationListener<ContextStartedEvent> {
    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        System.out.println("====容器启动start事件执行====");
    }
}

public class ContextStopEvent implements ApplicationListener<ContextStoppedEvent> {
    @Override
    public void onApplicationEvent(ContextStoppedEvent event) {
        System.out.println("====容器停止stop事件执行====");
    }
}

public class ContextCloseEvent implements ApplicationListener<ContextClosedEvent> {
    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        System.out.println("====容器关闭close事件执行====");
    }
}

配置类中新增这四个类的Bean对象

@Bean
public ContextStartEvent getStart(){
    return new ContextStartEvent();
}

@Bean
public ContextRefreshEvent getRefresh(){
    return new ContextRefreshEvent();
}

@Bean
public ContextStopEvent getStop(){
    return new ContextStopEvent();
}

@Bean
public ContextCloseEvent getClose(){
    return new ContextCloseEvent();
}

测试代码:

public class ContextEventTest {
    private ConfigurableApplicationContext ctx;

    @Before
    public void doBefore(){
        ctx=new AnnotationConfigApplicationContext(SimpleConfig.class);
    }

    @After
    public void doAfter(){
        ctx.registerShutdownHook();
    }

    @Test
    public void test(){
        ctx.start();
        ctx.stop();
        ctx.close();
    }
}

打印结果

====容器刷新refresh事件执行====
====容器启动start事件执行====
====容器停止stop事件执行====
====容器关闭close事件执行====

【注】原创文章,欢迎点赞、转发、评论。转载请先与作者联系

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李奇技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值