博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【spring学习笔记 】(一)spring容器注解汇总@Bean@Named @Resource @Inject @Component @Autowired的使用
阅读量:3903 次
发布时间:2019-05-23

本文共 5361 字,大约阅读时间需要 17 分钟。


注解汇总表

在这里插入图片描述

@Named

@Named使用在属性和参数上,作用是根据名字查找容器中对应的对象;也可以使用在类上,用于对该类进行组件的标注,功能类似于在XML文件中配置Bean。使用方式如下:

@Named("namedBeanAnno")                                 //定义该类的实例在容器中的名字public class NamedBeanAnno {
}

与XML配置一样,如果不指定Bean的名字,默认以首字母小写的类名作为Bean的名字。除了@Name注解外,Spring也支持JSR-250的@ManagedBean的组件注解

@Resource——依赖注入注解

@Resource是JSR-250的注解,用来标注系统或容器中资源类型的对象引用,包括持久层访问对象资源(DAO)、文件或容器等资源。@Resource注解的定义在rt.jar中。Spring支持这个注解来引用被Spring容器管理的对象,包括自定义的Bean实例和容器对象。@Resource可以使用在属性和属性的Setter方法上,使用示例如下:

public class ResoureAnno {
@Resource //注解使用在属性上,注入注解自定义类的对象 private cn.osxm.ssmi.com.Foo foo; @Resource //注解使用在属性上,注入容器类的对象 private ApplicationContext context; @Resource //注解使用在setter方法上,注入参数定义的对象 public void setBar(Bar bar) {
this.bar = bar; } }

@Resource注解的属性或Setter方法,默认会以属性名或Setter方法参数名去查找容器中的对象,如果没找到,则使用类来查找和注入。也可以显式地使用属性name来查找指定名称的Bean实例,例如:

@Resource(name=“foo”) //通过名字查找容器中对应的对象
private cn.osxm.ssmi.com.Foo foo;

@Inject——依赖注入

@Inject可以使用在构造函数、属性和属性的Setter方法上,用来注入依赖对象,使用示例如下:

@Inject        //1.构造函数注入依赖对象  public InjectNamedAnno(Foo foo) {
this.foo = foo; } @Inject //2. 属性注入依赖对象 private Bar bar; @Inject //3. 属性Setter方法注入依赖对象 public void setBaz(Baz baz) {
this.baz = baz; }

@Inject注解的属性、函数和方法,默认会以属性或参数的名称查找容器中的对象。参数也可以结合@Named注解,指定需要注入的Bean的名字,代码示例如下:

@Injectpublic void setBaz(@Named("baz") Baz baz) {
//结合@Named注入指定名字的依赖 this.baz = baz;}

注意:如果注入的Bean没找到,则容器在初始化时会抛出UnsatisfiedDependency-Exception的异常提示。

@Autowired

在XML中通过<\constructor-arg>和<\property>标签进行构造器注入和属性注入依赖对象是传统的依赖注入方式,但这种方式较为烦琐,特别是对于依赖项特别多的状况,Bean的配置就显得冗杂,容易出错,整个XML文件的维护也比较麻烦。Spring提供了@Autowired注解,直接在代码中进行依赖对象的自动装载,大大简化了配置,提高了开发效率。 @Autowired注解可以使用在类构造器、属性和属性Setter方法甚至一般的方法上,也可以混合使用。

1.在构造器中使用@Autowired

下面以AutowiredUsage这个类的构造器为例,使用方式如下:

@Autowired //自动装载注解使用在构造器中 02 public AutowiredUsage(Foo foo)  {
03 this.foo = foo; 04 }

构造器的参数名和容器中存在的该类的实例名可以不一样,此时,容器会通过类型查找,如果该类的实例存在多个的话会出错。一般而言,建议保持参数的名称与需要注入的依赖的Bean名称一致。

2.在方法中使用@Autowired @Autowired可以使用在属性的Setter方法中,也可以用在一般的方法

中,例如:

@Autowired                                          //在属性的Setter方法中使用  public void setBar(Bar bar) {
this.bar = bar; } @Autowired //使用在一般方法中 public void myInitBar(Bar bar) {
this.bar = bar; }

注意:这里注解@Autowired的一般方法虽然没有被调用,容器也会将依赖对象注入,对应上面会设置bar属性的值。

3.在属性中应用@Autowired 可以在任何作用域的属性中使用@Autowired注解,包括private、public和protected,使用方式如下:
//使用在属性定义上
@Autowired
private Baz baz;

@Autowired默认根据类来查找和注入容器中管理的对象,对于注解的属性和参数依赖要确保相应的Bean被容器托管(对于XML配置的方式,要在配置文件中有定义相应的Bean),否则容器在初始化的时候就会找不到依赖对象而无法正常启动。如果多个Bean对应同一个类的话,则使用该类集合类型装载就可以得到该类的所有Bean的集合,集合类型包括该类的Array[]、Set和Map。集合类型也可以应用在构造器和方法的自动装载的注解方式中,以属性注解方式来看

@Autowired        //自动装载集合类型的依赖 private Set
bazSet; @Autowired //自动装载键值对类型的依赖private Map
bazMap;

@Component

在类中使用@Component注解,容器可以在启动时进行该类的实例化。@Component是通用的组件注解,在Java Web开发中对应不同的组件层级,Spring在@Component元注解的基础上定义了不同类型的子注解,常用的包括@Controller、@Service和@Repository,分别对应到控制层、服务层和数据访问层的组件。相比@Component,这3个注解提供了对应层级的一些附加功能,比如@Repository提供了持久层处理异常的自动转换。

通过配置<\context:component-scan>标签即可开启@Component的注解功能,默认状况下会扫描base-package包下的所有@Component和子注解(@Controller、@Service和@Repository)标注的类进行实例化并注册。如果需要对扫描和注册的类及注解做一些过滤,有两种方式可以做到,分别是使用<\context:exclude-filter>子标签,以及使用<\context:incluce-filter>子标签和use-default-filters属性。

@Autowired、@Inject用法基本一样,不同的是@Inject没有一个request属性

@Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的

@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用,@Resource则通过name进行指定

@Bean——方法层级的组件注解

@Bean——方法层级的组件注解 @Component及其子注解是使用在类层级的组件注解,也可以在类方法上使用@Bean注解来注册Bean,例如:

@Component                                                  //组件注解  public class Foo {
@Bean //在组件类中使用@Bean定义组件 public Bar myInifBar() {
return new Bar(); } }

@Bean注解的方法需要有非空的返回类型,返回的对象就是注册Bean的对象。该注解只有在其方法对应的 类被注册为Bean的状况下才有效(可以通过XML配置或@Component注解配置)。 默认状况下,@Bean注解方法注册的Bean的id是方法名。可以使用name属性指定名称,value属性指定别名。name和value可以单独分别使用,也可以一起使用,共同使用需要保持name和value的值一致,否则会出错。 @Bean(name=“barBean”,value=“barBean”)

容器在执行@Bean注解方法实例化Bean时,如果该方法有输入参数,则容器会根据参数名查找Bean并作为依赖项进行注入,没找到,则容器启动失败。 XML配置的Bean使用init-method和destroy-method属性设置初始化和销毁的回调方法,与此类似,@Bean注解使用initMethod和destroyMethod属性定义回调方法(从这里也可以看出XML中的命名和Java中的命名的区别,XML使用全小 写和“-”分隔,Java使用的是驼峰命名法)。@Bean注解默认注册的是singleton作用域的Bean实例,结合@Scope注解,可以定义其他的作用域范围,比如原型作用域定义@Scope(“prototype”)。 使用@Description注解可以对该Bean做一些详细的描述,注解的描述内容通过beanDefinition.getDescription()方式获取。下面是一个较为完整的示例:

@Description(value = "这是一个通过@Bean注解方法产生的bean") //给Bean添加说明@Bean(name="userByMethod",initMethod="userInit",destroyMethod="userDestroy")                                                  //Bean配置@Scope("singleton")                                     //作用域配置public User user(Foo foo) {
System.out.println("@Bean注解方法的参数是依赖注入对象:"+foo); return new User("Oscar");}

注意:若是在springboot中你可以理解@Configuration注解的类就是一个xml配置文件,中间@Bean注解就是xml中的bean节点

问:哪些类可以配置为bean

理论上,符合JavaBean规范的类和不符合JavaBean规范的POJO都可以配置成Bean,也就是说,基本上所有的类都可以配置成Bean并交由Spring控管。容器使用反射机制来创建对象和注入依赖,过度地使用对系统的性能会产生不必要的浪费。对于细粒度的域对象,类似于实体类就没有必要交由容器管理。从类实现的功能上看,交由容器控管的对象主要包括以下几种:

·服务层对象:包括桌面应用中的逻辑功能类,以及Web MVC应用中的控制类、服务类。

·数据访问对象:和数据库进行操作,对数据进行增、删、改、查的类对象及事务处理的相关类对象。

·框架基础对象:例如框架用于注解支持的类和持久化框架整合的基础对象等

一个配置实例:

转载地址:http://lxten.baihongyu.com/

你可能感兴趣的文章
HDU 2602 Bone Collector (01背包)
查看>>
POJ 1837 Blance (01背包)
查看>>
HDU 2456 饭卡 (01背包)
查看>>
HDU 1559 最大子矩阵
查看>>
Open Judge 4010 :2011
查看>>
百练OJ-2815 城堡问题【DFS】
查看>>
CODE[VS] 1025 选菜 【背包】
查看>>
POJ 1724 ROADS【DFS+剪枝】
查看>>
AOJ 847 整数拆段
查看>>
AOJ 848 分数拆分
查看>>
UVA 133 The Dole Queue 【约瑟夫环】
查看>>
XDOJ 1208 B.笑爷买房 【DFS】
查看>>
部门年度工作总结的内容
查看>>
pandas学习笔记
查看>>
Numpy笔记
查看>>
正则表达式
查看>>
python线程进程笔记
查看>>
TensorFlow初学者必须了解的55个经典案例
查看>>
机器学习笔记
查看>>
数十种TensorFlow实现案例汇集:代码+笔记
查看>>