`
moonkk1987
  • 浏览: 8844 次
社区版块
存档分类
最新评论

spring注解详解[转]

阅读更多

Spring 3之零配置注解详解

 

<context:component-scan base-package="cn.java......" />标签将自动开启“注解实现Bean依赖注入”支持,标签来表示需要自动注册Bean定义,而通过base-package属性指定扫描的类路径位置。

 

<aop:aspectj-autoproxy /> 用于开启spring对@AspectJ风格切面的支持。

 

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd"
    default-lazy-init="true">
    
    <context:annotation-config />
    <context:component-scan base-package="com.chou.spring.bean"/>
    <aop:aspectj-autoproxy proxy-target-class="true" />

    <bean id="myBeanAA" class="com.chou.spring.bean.MyBeanA" />
</beans>

 

//main方法
ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext-an.xml");
MyBeanB b = cxt.getBean("myBeanB",MyBeanB.class);
b.domain();

 

Spring自带的@Component注解及扩展:@Respository  @Service  @Controller

 

常见的Bean的配置元数据:@Lazy,@DependsOn,@Scope,@Qualifier,@Primary

 

常见的依赖注入注解:@Autowired:自动装配,@Value:注入SpEL表达式,@Qualifier:限定描述符,@Resource:自动装配,@PostConstruct和@PreDestroy:通过注解指定初始化和销毁方法定义;

 

@Repository
public class MyBeanB implements MyBean{
	protected static final Log logger = LogFactory.getLog(MyBeanB.class);
	
	@PostConstruct 
	public void MyInit(){
		logger.info("[INFO]...MyBeanB is initing...", null);
	}
	
	@PreDestroy 
	public void Mydestory() {
		logger.info("[INFO]...MyBeanB is destorying...", null);
	}
	
	/**
	 * @Autowired 默认byType进行自动装配,可以用于构造器、字段、方法注入
	 * 且必须有一个Bean候选者注入,如果允许出现0个Bean候选者需要设置属性“required=false”,
	 * “required”属性含义和@Required一样,只是@Required只适用于基于XML配置的setter注入方式。
	 * 
	 * @Resource 默认如果name和type属性都不指定,将先byName自动装配,找不到再byType
	 * 如果配置了name属性,使用byName进行自动装配,而使用type时则使用byType进行装配
	 * 如果同时指定name和type,则从容器中找唯一匹配的bean装配,找不到抛出异常
	 * 
	 * @Resource 注解应该只用于setter方法注入和字段属性注入,不能提供如@Autowired多参数方法注入;
	 * @Resource 首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,
	 * 因此如果JNDI环境中有和Spring容器同名的资源时需要注意。
	 */
	//@Resource //注意这里是javax.annotation.Resource
	private MyBeanA bean;
	
	@Autowired(required = true)
	public void setBean(@Qualifier("myBeanAA") MyBeanA myBean) {
		//@Qualifier用于按类型自动装配时有多个同类型的bean时,规定选择某一个名称的bean
		this.bean = myBean;
	}
	
	public void domain(){
		System.out.println("MyBeanB is executing...");
		bean.domain();
		bean.sayAround("haha");
		//throw new RuntimeException("This is a RuntimeException");
	}
	
}

 

@Component("myBeanA")//初始化bean的名字默认是类名第一个字母小写
//@Controller 表示层
//@Service //业务逻辑层
//@Repository //数据访问层

//@Lazy(false) //延迟初始化
//@DependsOn("myBeanB") ////定义Bean初始化及销毁时的顺序
//@Scope("prototype") //默认单例singleton
//@Primary //自动装配时当出现多个Bean候选者时,将作为首选者
public class MyBeanA{
	protected static final Log logger = LogFactory.getLog(MyBeanA.class);
	
	@PostConstruct
	public void MyInit(){//bean初始化之前调用的方法,等同于xml配置的init-method
		logger.info("[INFO]...MyBeanA is initing...", null);
	}
	
	@PreDestroy
	public void Mydestory() {//bean销毁之前调用的方法,等同于xml配置的destroy-method
		logger.info("[INFO]...MyBeanA is destorying...", null);
	}
	
	//@Value用于注入SpEL表达式,可以放置在字段方法或参数上
	@Value(value = "#{'Hello Spring!!!'[0]}")
	private String myName;
	
	@Value("#{100}")
	private Long myAge;
	
	private Map<String, String> resultMap;
	
	@Value("abc")
	private String arg1;
	
	@Value("101")
	private Long arg2;
	
	@Value("#{1==1 ? true : false}")
	private Boolean b1;
	
	@Value("#{'no'}")
	private Boolean b2;
	
	@Value("#{'on'}")
	private Boolean b3;
	
	@Value("#{@systemProperties}")
	private Properties pros;
	
	@Value("#{ new double[]{100,44,3.1415,0.4432} }")
	private Double[] nums;
	
	public void domain() {
		System.out.println("MyBeanA is executing...");
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]);
		}
		System.out.println(pros.getProperty("os.name"));
		//System.out.println(System.getProperties());
		System.out.println(b1);
		System.out.println(b2);
		System.out.println(b3);
		System.out.println(arg1);
		System.out.println(arg2);
		System.out.println(myName);
		System.out.println(myAge);
		if (resultMap != null) {
			System.out.println(resultMap.values());
		}
	}
	public void sayAround(String param) {  
		  System.out.println("around param:" + param);  
	}

	//依赖检查必须是set方法上,并通过xml文件的property属性注入
	//@Required 表示一定要有property属性注入,很少用到
	public void setResultMap(Map<String, String> resultMap) {
		this.resultMap = resultMap;
	}
	
}

 

 

 

@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,而@Aspect注解不能被Spring自动识别并注册为Bean,必须通过@Component注解来完成,示例如下: 

Java代码  收藏代码
  1. @Aspect  
  2. @Component  
  3. public class Interceptor {  
  4.       
  5.     @Pointcut("execution ( public * com.chou.spring.bean..*.domain(..))")  
  6.     public void myPointcut() {}   
  7.       
  8.     @Before("myPointcut()")  
  9.     public void beforeDomain() {  
  10.         System.out.println("This is beforeDomain....");  
  11.     }  
  12.       
  13.     @AfterReturning("execution ( public * com.chou.spring.bean.MyBeanA.domain(..))")  
  14.     public void afterReturning() {  
  15.         System.out.println("This is afterReturning....");  
  16.     }  
  17.       
  18.     @AfterThrowing("myPointcut()")  
  19.     public void afterThrowing() {  
  20.         System.out.println("This is afterThrowing....");  
  21.     }  
  22.       
  23.     @After("myPointcut()")  
  24.     public void afterDomain() {  
  25.         System.out.println("This is afterDomain....");  
  26.     }  
  27.       
  28.     @Around("execution(* com.chou.spring.bean..*.sayAround(..))")  
  29.     public Object around(ProceedingJoinPoint pjp) throws Throwable {    
  30.         System.out.println("===========around before advice");    
  31.         Object retVal = pjp.proceed(new Object[] {"【环绕通知】"});    
  32.         System.out.println("===========around after advice");    
  33.         return retVal;    
  34.     }  
  35. }  



细粒度控制Bean定义扫描 
在XML配置中完全消除了Bean定义,而是只有一个<context:component-scan>标签来支持注解Bean定义扫描。 

前边的示例完全采用默认扫描设置,如果我们有几个组件不想被扫描并自动注册、我们想更改默认的Bean标识符生成策略该如何做呢?接下来让我们看一下如何细粒度的控制Bean定义扫描,具体定义如下:
 

Xml代码  收藏代码
  1. <context:component-scan  
  2.         base-package=""  
  3.         resource-pattern="**/*.class"  
  4.         name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"  
  5.         use-default-filters="true"  
  6.         annotation-config="true">  
  7.         <context:include-filter type="aspectj" expression=""/>  
  8.         <context:exclude-filter type="regex" expression=""/>  
  9. </context:component-scan>     



  • base-package:表示扫描注解类的开始位置,即将在指定的包中扫描,其他包中的注解类将不被扫描,默认将扫描所有类路径;
  • resource-pattern:表示扫描注解类的后缀匹配模式,即“base-package+resource-pattern”将组成匹配模式用于匹配类路径中的组件,默认后缀为“**/*.class”,即指定包下的所有以.class结尾的类文件;
  • name-generator:默认情况下的Bean标识符生成策略,默认是AnnotationBeanNameGenerator,其将生成以小写开头的类名(不包括包名);可以自定义自己的标识符生成策略;
  • use-default-filters:默认为true表示扫描@Component、@ManagedBean、@Named注解的类,如果改为false默认将不扫描这些默认的注解来定义Bean,即这些注解类不能被扫描到,即不能通过这些注解进行Bean定义;
  • annotation-config:表示是否自动支持注解实现Bean依赖注入,默认支持,如果设置为false,将关闭支持注解的依赖注入,需要通过<context:annotation-config/>开启。


默认情况下将自动扫描@Component、@ManagedBean、@Named注解的类并将其注册为Spring管理Bean,可以通过在<context:component-scan>标签中指定自定义过滤器将扫描到匹配条件的类注册为Spring管理Bean,过滤器用里面的<context:include-filter />标签来定义: 

Xml代码  收藏代码
  1. <context:include-filter type="aspectj" expression=""/>  
  2. <context:exclude-filter type="regex" expression=""/>  

 

  • <context:include-filter>:表示扫描到的类将被注册为Spring管理Bean;
  • <context:exclude-filter>:表示扫描到的类将不被注册为Spring管理Bean,它比<context:include-filter>具有更高优先级;
  • type:表示过滤器类型,目前支持注解类型、类类型、正则表达式、aspectj表达式过滤器,当然也可以自定义自己的过滤器,实现org.springframework.core.type.filter.TypeFilter即可;
  • expression:表示过滤器表达式。


一般情况下没必要进行自定义过滤,如果需要请参考博客: 
http://jinnianshilongnian.iteye.com/blog/1461055 

基于Java类定义Bean配置元数据 
基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件。 

基于Java类定义Bean配置元数据中的@Configuration注解的类等价于XML配置文件,@Bean注解的方法等价于XML配置文件中的Bean定义。 

基于Java类定义Bean配置元数据需要通过AnnotationConfigApplicationContext加载配置类及初始化容器,类似于XML配置文件需要使用ClassPathXmlApplicationContext加载配置文件及初始化容器。 

分享到:
评论

相关推荐

    spring3注解详解

    Spring 3.0 是一个重要的版本,它引入了大量的注解,极大地简化了Spring框架的配置,使得开发人员能够更加专注于业务逻辑,而不再是XML配置。本文将深入解析Spring 3.0中的主要注解,帮助你更好地理解和使用它们。 ...

    spring注解使用详解

    【Spring注解使用详解】 Spring框架自2.5版本开始,引入了注解配置,使得开发者可以在不依赖XML配置文件的情况下实现Bean的定义和依赖注入。注解配置因其简洁、直观的特点,逐渐成为主流的配置方式。在本文中,我们...

    Spring注解详解

    1. 使用简化配置:Spring注解的主要目标就是减少XML配置,将bean定义和依赖注入等操作直接写在类或方法上。通过这种方式,开发者可以更加直观地了解类的职责和依赖关系,同时降低了维护成本。 2. 使用Bean定义注解...

    (转)Spring 3.0 注解注入详解

    Spring 3.0 是一个里程碑式的版本,引入了大量的新特性,其中注解注入是其核心改进之一。注解注入使得代码更加简洁,减少了XML配置,提高了开发效率。在这个专题里,我们将深入探讨Spring 3.0中的注解注入机制。 ...

    Spring 注解学习手札(一) 构建简单Web应用

    在本篇《Spring注解学习手札(一)构建简单Web应用》中,我们将深入探讨如何使用Spring框架的注解来构建一个基本的Web应用程序。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛应用。它简化了依赖注入、...

    spring注解的详解及实例

    ### Spring注解详解及实例分析 #### 概述 随着技术的发展与演进,Spring框架在不断迭代过程中引入了大量的注解来简化应用的配置过程。相比于传统的XML配置方式,注解配置提供了更为简洁且直观的方式来定义Bean以及...

    spring注解aop配置详解

    本篇将深入讲解如何通过注解来配置Spring AOP,以实现更加简洁、高效的代码编写。 首先,我们来看注解在Spring AOP中的应用。在传统的AOP配置中,我们需要定义切入点表达式和通知(advice)在XML配置文件中。然而,...

    spring注解注入示例详解.pdf

    Spring提供了多种注解来帮助开发者实现依赖注入,其中包括@Autowired、@Qualifier、@Resource以及@PostConstruct等。下面将详细介绍这些注解的使用方法和区别。 1. @Autowired注解 @Autowired是Spring提供的注解,...

    使用Spring 2.5 基于注解驱动的 Spring MVC详解

    使用 Spring 2.5 基于注解驱动的 Spring MVC 详解 本文将介绍 Spring 2.5 新增的 Spring MVC 注解功能,讲述如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。 Spring MVC 注解驱动 在 Spring 2.5 中,...

    spring注解笔记

    ### Spring注解知识点详解 #### 1. Spring注解基础 在Spring框架中,注解是一种轻量级的依赖注入方式,能够简化配置并提高开发效率。在本节中,我们主要介绍几个Spring中常用的注解,它们分别是@Component、@...

    spring注解详解

    Spring框架的注解详解 Spring框架自2.5版本开始引入了注解配置,使得开发者可以更加便捷地管理Bean和装配Bean,减少了XML配置的工作量。注解配置的优势在于其与Java代码的紧密集成,利用Java的反射机制,提高了开发...

    Spring注解驱动开发.pdf

    ### Spring注解驱动开发知识点详解 #### 一、Spring注解驱动概述 Spring框架通过引入注解支持,极大地简化了Java EE应用的开发工作。它不仅提供了基础的依赖注入功能,还增强了对组件扫描的支持,使得开发者能够...

    Spring @compenent注解详解

    在Spring框架中,`@Component`注解是核心的组件注解之一,它标志着一个类作为Spring IoC容器中的Bean。这个注解及其派生注解(如`@Service`、`@Repository`和`@Controller`)是Spring依赖注入(Dependency Injection...

    spring注解

    Spring 注解详解 Spring 注解是 Spring 框架中的一种强大功能,它允许开发者使用注解来配置和管理 Bean 对象。本文将详细讲解 Spring 注解的含义、类型、使用方法和相关配置。 注册注解处理器 在 Spring 中,需要...

Global site tag (gtag.js) - Google Analytics