@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名

1 基于xml方式bean使用回顾

2 注解@Bean详细使用说明

3 注解@Bean的源码解析

1,基于xml方式bean使用回顾

新建一个maven项目增加spring-context的jar包如下:

<dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>4.3.16.RELEASE</version>
</dependency>

定义一个user用户bean对象如下:

/*** 定义一个用户对象bean** @date 2018年4月30日*/
public class User {/*** 用户名*/private String userName;/*** 年龄*/private Integer age;/*** 省略 get set方法*/
}

在src\main\resources目录下边新建一个beans.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!-- 定义一个id为user的bean对象 --><bean id="user" class="com.zhang.bean.User"><property name="age" value="26"></property><property name="userName" value="zhangsan"></property></bean>
</beans>

编写一个测试类如下:

/*** 测试类* @date 2018年4月30日*/
public class ApplicationTest {@SuppressWarnings("resource")public static void main(String[] args) {// 使用ClassPathXmlApplicationContext获取spring容器ApplicationContextApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");// 根据bean id获取bean对象User bean = (User) applicationContext.getBean("user");System.out.println(bean);}
}运行结果如下:User [userName=zhangsan, age=26]

2,注解@Bean详细使用说明

以上的例子这边再用注解来实现一次,首先定义一个注解配置文件如下:

/*** 定义一个注解配置文件 必须要加上@Configuration注解** @author zhangqh* @date 2018年4月30日*/
@Configuration
public class MainConfig {/*** 定义一个bean对象* @return*/@Beanpublic User getUser(){return new User("zhangsan",26);}
}

在以上测试类中增加注解的测试代码如下:

// 使用AnnotationConfigApplicationContext获取spring容器ApplicationContext2
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
System.out.println(bean2);运行结果如下:User [userName=zhangsan, age=26]

到此我们用注解@Bean也同样实现了和xml一样bean的注册

首先我们看一下@Bean注解的源代码如下:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};Autowire autowire() default Autowire.NO;String initMethod() default "";String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}

我们发现@baen注解的@Target是ElementType.METHOD,ElementType.ANNOTATION_TYPE也就说@Bean注解可以在使用在方法上,以及一个注释类型声明,具体注解详细说明可以查看之前写的一篇文章深入理解java注解的实现原理

具体参数如下:

value -- bean别名和name是相互依赖关联的,value,name如果都使用的话值必须要一致
name -- bean名称,如果不写会默认为注解的方法名称
autowire -- 自定装配默认是不开启的,建议尽量不要开启,因为自动装配不能装配基本数据类型、字符串、数组等,这是自动装配设计的局限性,以及自动装配不如显示依赖注入精确
initMethod -- bean的初始化之前的执行方法,该参数一般不怎么用,因为可以完全可以在代码中实现
destroyMethod -- bean销毁执行的方法

下面来演示几个配置:为user用户bean增加注解名称如下:

@Bean(value="user0",name="user0")

打印所有的bean名称如下:

String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
for (String name : namesForType) {System.out.println("bean名称为==="+name);
}

bean名称为===mainConfig
bean名称为===user0

如果value和name内容不一样如:

@Bean(value="user0",name="user1")
Exception in thread "main" org.springframework.core.annotation.AnnotationConfigurationException: In AnnotationAttributes for annotation [org.springframework.context.annotation.Bean] declared on public com.zhang.bean.User com.zhang.config.MainConfig.getUser(), attribute 'name' and its alias 'value' are declared with values of [{user1}] and [{user0}], but only one is permitted.at org.springframework.core.annotation.AnnotationUtils.postProcessAnnotationAttributes(AnnotationUtils.java:1301)at org.springframework.core.annotation.AnnotatedElementUtils.getMergedAnnotationAttributes(AnnotatedElementUtils.java:394)at org.springframework.core.type.StandardMethodMetadata.getAnnotationAttributes(StandardMethodMetadata.java:124)at org.springframework.context.annotation.AnnotationConfigUtils.attributesFor(AnnotationConfigUtils.java:280)at org.springframework.context.annotation.AnnotationConfigUtils.attributesFor(AnnotationConfigUtils.java:276)at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:187)at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:140)at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116)at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:320)at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84)at com.zhang.ApplicationTest.main(ApplicationTest.java:26)

报错如上

在用户bean中增加初始化和销毁的方法如下:

public void initUser(){System.out.println("初始化用户bean之前执行");
}
public void destroyUser(){System.out.println("bean销毁之后执行");
}

注解如下:

@Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")

运行如下:

初始化用户bean之前执行
User [userName=张三, age=26]

发现销毁方法没有执行,原因是bean销魂之前程序已经结束了,可以手动close下如下:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
System.out.println(bean2);
// 手动执行close方法
applicationContext2.close();

运行结果如下:

初始化用户bean之前执行
User [userName=张三, age=26]
bean销毁之后执行

spring注解之@Bean 的用法总结相关推荐

  1. spring注解详解与用法(总览)

    这篇文章收集了我写的所有的spring注解的详细说明与用法,点击可以跳转到对应文章,此文章会不断更新 spring注解详解与用法(1)最基础也是最常见的如下所示,详情点击这里 @Controller/ ...

  2. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  3. 在Servlet中获取Spring注解的bean

    最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理 ...

  4. 零配置 之 Spring注解实现Bean定义

    转载自  零配置 之 12.3 注解实现Bean定义 --跟我学spring3 12.3  注解实现Bean定义 12.3.1  概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[1 ...

  5. 零配置 之 Spring 注解实现Bean依赖注入

    转载自  [第十二章]零配置 之 12.2 注解实现Bean依赖注入 --跟我学spring3 12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入. ...

  6. 利用spring注解创建bean

    spring注解 spring 原始注解 1.1 @Component注解 1.2 @Controller,@Service,@Repository同上 1.3 注解方式依赖注入 spring 新注解 ...

  7. java 获取bean的注解_如何获取spring 注解的bean

    展开全部 不用e69da5e887aa62616964757a686964616f31333337613131配置xml,直接java代码实现,参考代码如下:public class GetAppli ...

  8. Spring注解定义 bean 的12种方法

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  9. spring注解详解与用法(3)切面环绕

    导航:更多的spring注解标签点击这里 声明了切面类我们还需要定义切面的内容面向切面编程是spring的一个重要思想,也是精华之一 @Aspect 这是一个切面的注解,声明是一个额外的面向切面的功能 ...

最新文章

  1. html 物流状态,css+html如何实现物流进度样式(代码示例)
  2. 【读书笔记】建造者模式代码完成与大家分享
  3. 运行tensorflow代码出现dtypes.py:516: FutureWarning: Passing (type, 1) or '1type的解决方法(亲测)
  4. 前端学HTTP之字符集
  5. 计算机博士专业学位,河海大学计算机应用技术博士专业学位研究生培养方案
  6. Linux服务-FTP文件服务器部署
  7. Python中yield简单用法
  8. 命令启动jar包_java项目打jar包,一句命令搞定
  9. 处理机调度的概念、层次
  10. 【服务器】Cloudreve绑定七牛云免费对象存储
  11. 数据爬取 mail_Python网络爬虫实战,数据解析!
  12. xposed框架安全模式_Android 系统上的 Xposed 框架中都有哪些值得推荐的模块?
  13. 系统运维工程师必备面试题库
  14. C语言调试(Dev-C++)(初步)
  15. 如何做好固定资产管理和盘点?切实可行的方案来了
  16. 【T-SQL】T-SQL语句整理(基于SQL Server)
  17. IL2CPP是什么?
  18. CDOJ 1059 秋实大哥与小朋友(离散化)
  19. 反序列化失败although at least one Creator existsno delegate- or property-based Creator 异常
  20. IPD百科 | IPD产品管理体系中产品经理能力模型

热门文章

  1. 薪资结构重铸: Zebec将业务范围扩大到Web2薪资管理领域
  2. 【概念卡片】李笑来:资本(一)你正在消耗你的无形资产而不自知?
  3. 游戏夜读 | 记忆里的老游戏
  4. 【零碎的小知识】【网络组成】手机可以连校园网但是电脑连不上
  5. 笔记本配置性价比选购
  6. jquery拖动DIV
  7. Libuv源码解析 - uv_run
  8. 响应输出HTML处理,JSP response对象:响应客户端的请求并向客户端输出信息
  9. 网络带宽测试-iperf
  10. 导购网站的SEO优化