文档章节

Spring annotation2

zswitos
 zswitos
发布于 2015/04/24 16:18
字数 875
阅读 15
收藏 0

Spring2

1 spring的IOC container(2)

1.3 spring Annotations

前提在一个applicatcontext中打开注解扫描器配置:

<context:annotation-config/>
Note
<context:annotation-config/> only looks for annotations on beans in the same application
context in which it is defined. This means that, if you put <context:annotation-config/>in a WebApplicationContext for a DispatcherServlet, it only checks for @Autowired
beans in your controllers, and not your services. See Section 17.2, “The DispatcherServlet” for
more information.
在哪个容器中打开就扫描相应的注解!

@Required :The @Required annotation applies to bean property setter methods, as in the following

@Autowired

单个方法参数注入
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
    this.movieCatalogs = movieCatalogs;
}
多个方法参数注入
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;

}

如果你在一个类的多个构造器使用这个注解,spring只能搜寻参数最多的一个使用,故官方做法只标注一个构造去就好

为一个接口类注入实例
@Autowired
private ApplicationContext context;

@Autowired, @Inject, @Resource, and @Value annotations are handled by a Spring BeanPostProcessor implementations which in turn means that you cannot apply these annotations within your own BeanPostProcessor or BeanFactoryPostProcessor types (if any). These types must be wired up explicitly via XML or using a Spring @Bean method.


@Qualifier : 当你用@Autowired去注入一个实例的时候往往会筛选出好多的备选对象,这时候spring提供舒适的服务,配置这个注解,做更精确的筛选(从备选中筛选出id为制定的对象)!

public class MovieRecommender {
    @Autowired
    @Qualifier("main"),
    private MovieCatalog movieCatalog;
// ...
}
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
    @Autowired
    public void prepare(@Qualifier("main")MovieCatalog movieCatalog,
    CustomerPreferenceDao customerPreferenceDao) {
    this.movieCatalog = movieCatalog;
    this.customerPreferenceDao = customerPreferenceDao;
    }
// ...
}

当你用bean 定义的name进行注入的时候及不能用@Autowired了,改换@Resource,还有注入Map Collection类型的时候也不能用@Autowired

@Autowired applies to fields, constructors, and multi-argument methods, allowing for narrowing through qualifier annotations at the parameter level

@Resource is supported only for fields and bean property setter methods with a single argument.

自定义

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Genre {
    String value();
}


public class MovieRecommender {
    @Autowired
    @Genre("Action")
    private MovieCatalog actionCatalog;
    private MovieCatalog comedyCatalog;
    @Autowired
    public void setComedyCatalog(@Genre("Comedy") MovieCatalog comedyCatalog) {
        this.comedyCatalog = comedyCatalog;
    }
// ...
}

@Resource : 通过bean注册的name查找引用实例

public class SimpleMovieLister {
    private MovieFinder movieFinder;
    @Resource(name="myMovieFinder")
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

不指定name就是给根据set方法后面去取

public class SimpleMovieLister {
    private MovieFinder movieFinder;
    @Resource
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

这个等价于 @Resource(name="movieFinder")

The name provided with the annotation is resolved as a bean name by the ApplicationContext of which the CommonAnnotationBeanPostProcessor is aware.

不显示指定名称处理工程跟@Autowired一样了,按照类型找出匹配的对象

@Configuration, @Bean, @Import, and @DependsOn 这些java的注解也可以使用了!


Spring stereotype annotations

@Component, @Service, and @Controller  @Repository


<context:component-scan>开启后。没必要使用<context:annotation-config>这个了 ,他包括了后者的注解

AutowiredAnnotationBeanPostProcessor
and
CommonAnnotationBeanPostProcessor are both included implicitly when you use the component-
scan element. That means that the two components are autodetected and wired together - all without
any bean configuration metadata provided in XML.


Using filters to customize scanning

@Configuration
@ComponentScan(basePackages = "org.example",
includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
excludeFilters = @Filter(Repository.class))
public class AppConfig {
...
}

或者
<beans>
<context:component-scan base-package="org.example">
<context:include-filter type="regex"
expression=".*Stub.*Repository"/>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>

Defining bean metadata within components

@Component
public class FactoryMethodComponent {
@Bean
@Qualifier("public")
public TestBean publicInstance() {
    return new TestBean("publicInstance");
}
public void doWork() {
// Component method implementation omitted
}
}

Using JSR 330 Standard Annotations

标准注解

Dependency Injection with @Inject and @Named Instead of @Autowired, @javax.inject.Inject may be used as follows:

import javax.inject.Inject;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}

As with @Autowired, it is possible to use @Inject at the class-level, field-level, method-level and
constructor-argument level. If you would like to use a qualified name for the dependency that should be
injected, you should use the @Named annotation as follows:

import javax.inject.Inject;
import javax.inject.Named;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}


@Named: a standard equivalent to the @Component annotation


instead of @Component, @javax.inject.Named may be used as follows:

import javax.inject.Inject;
import javax.inject.Named;
@Named("movieListener")
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}



© 著作权归作者所有

共有 人打赏支持
zswitos
粉丝 4
博文 60
码字总数 55712
作品 0
海淀
程序员
JAVA annotation入门

最近对spring源码感兴趣,今天看到annotation部分,略记之。 一. 最常见的annotation @Override:用在方法之上,用来告诉别人这一个方法是改写父类的 @Deprecated:建议别人不要使用旧的API的时...

Josean_Luo
2014/06/08
0
0
spring 相关jar包详解

spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应...

满风
2011/10/20
0
0
Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密...

小致dad
08/03
0
0
Spring Boot实战与原理分析

Spring Boot实战与原理分析 1:Spring Boot概述与课程概要介绍 2:Spring4 快速入门 3:Spring4 扩展分析(一) 4:Spring4 扩展分析(二) 5:Spring Boot 快速入门 6:Spring Boot 配置分析...

刘宗泽
06/26
0
0
2014-03-09 Spring的学习(0)-----Spring目录文件组织

Spring压缩包目录说明 目录名 相关介绍 aspectj 在Spring框架下使用aspectj的源代码和测试程序文, 是java最早的提供AOP的应用框架 dist Spring 的发布包,关于发布包下面会详细进行说明。 do...

查封炉台
2014/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
今天
187
4
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
今天
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
2
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部