文档章节

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;
}
// ...
}



© 著作权归作者所有

共有 人打赏支持
上一篇: Spring resource
下一篇: spring annotation
zswitos
粉丝 4
博文 60
码字总数 55712
作品 0
海淀
程序员
私信 提问
JAVA annotation入门

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

Josean_Luo
2014/06/08
0
0
Spring Cloud Greenwich.M3 版本发布

Spring Cloud Function 的第三个 Milestone 3 已发布,该版本的各个模块现可在 Spring Milestone 存储库中使用。 主要更改 此版本与 Spring Boot 2.1.0.RELEASE 兼容,并已对 Java 11 兼容性...

淡漠悠然
11/22
1K
0
Spring Cloud Edgware.SR5 发布,大量 bug 修复

Spring Cloud Edgware SR5(Service Release 5)已发布,可在 Maven Central 下载该版本。 主要更新 Spring Cloud Commons Bug fixes Spring Cloud Config Documentation and Bug fixes Spr......

淡漠悠然
10/18
1K
0
Spring Cloud Finchley 正式发布,兼容 Spring Boot 2.0.x

经过数个前期测试版本,Spring Cloud Finchley 终于迎来了正式版本: 下载地址 发行说明 显著变化: 与 Spring Boot 2.0.x 兼容 不支持 Spring Boot 1.5.x 最低要求 Java 8 新增 Spring Clo...

淡漠悠然
06/20
7.9K
22
Spring IO Platform 1.1.5/2.0.1 发布

Spring IO Platform 1.1.5/2.0.1 发布,现已提供在 repo.spring.io 和 Maven Central。Spring IO Platform 1.1.5 是个维护版本,主要包括最新的维护版本: Spring Batch 3.0.6.RELEASE Sprin......

oschina
2015/12/19
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

新鲜出炉,2019最新大厂面试题总汇!

在这个互联网技术快速迭代的时代,每个程序员都知道技术对于职业发展的重要性,那些技术好的程序员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去大厂做...

Java干货分享
22分钟前
4
0
一、什么是ActiveMQ

首先我们应该先了解J2EE中的一个重要规范:JMS(The Java Message Service)Java消息服务。而JMS的客户端之间可以通过JMS服务进行异步的消息传输。它主要有两种模型:点对点和发布订阅模型。 ...

watermelon11
27分钟前
1
0
课时17 第三课Spark内部原理剖析与源码阅读(五)

为何spark shuffle比mapreduce shuffle慢? 主要是spark shuffle的shuffle read阶段还不够优秀,它是基于hashmap实现的,shuffle read会把shuffel write阶段已经排序数据给重新转成乱序的,转...

刀锋
44分钟前
1
0
Function函数式接口

Function函数式接口传入一个参数,返回一个值。 然后我们使用这个写个demo看看: 输出: 接口内部还有两个default方法和一个static方法,然后我们先看一下static方法 返回一个始终返回其输入...

woshixin
59分钟前
1
0
开发者和架构师之间最大的区别是什么?

1、开发者和架构师之间最大的区别是什么? 架构师和开发者一样,也经常写代码,简单的说,开发者和架构师之间最大的区别就是技术领导力。 软件架构师的角色需要理解最重要的架构驱动力是什么...

James-
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部