首页 > 代码库 > spring注解使用

spring注解使用

一、使用注解前,在配置文件中,引入context命名空间

xmlns:context=http://www.springframework.org/schema/context
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">

二、在配置文件中加入context:annotation-config标签

<context:annotation-config/>

这个配置隐式注册了多个对注释进行解析处理的处理器

AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor

三、用来装配的注解

@Autowired

@Autowired 默认按类型装配

@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false

@Autowired可用于属性字段上,也可用于属性set方法上。

@Autowired(request=false)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

或者

private UserService userService;
@Autowired(request=false)
public void setUserService(UserService userService){
    This.userService= userService;
}

如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:

@Autowired@Qualifier(“UserService”)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

@Resource

@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

注:@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar

当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象

当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

@Resource(name=”userService”)
private UserService userService;
public void setUserService(UserService userService){
    This.userService= userService;
}

或:

private UserService userService;
@Resource(name=”userService”)
public void setUserService(UserService userService){
    This.userService = userService;
}


注意:如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

@PostConstruct

指定Bean的初始化方法

@PreDestroy

指定Bean的销毁方法

四、扫描:

在大型项目中,通常会有上百至上千个组件,如果这些组件都采用xmlbean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component@Service@Controller@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。

使用扫描前同样需要注意命名空间。

在配置文件中添加context:component-scan标签

<context:component-scanbase-package="com.gg "/>

其中base-package为需要扫描的包(含子包)

@Service用于标注业务层组件、

@Controller用于标注控制层组件(如struts中的action)、

@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

五、注解AOP

启用spring@AspectJ切面配置的支持,并确保自动代理

<aop:aspectj-autoproxy/>

以前置通知为例:

声明一个接口:

public interface You {
    void buyApple();
    void buyBunana();
}

实现类:

public class YouImpl implements You {
    public void buyApple() {
      System.out.println("买苹果!");
  }
 
  publicvoid buyBunana() {
    System.out.println("买香蕉!");
  }
}

拦截器:

@Aspect
public class MyInterceptor {
    @Pointcut("execution(*com.gg.test.aop.You.*(..))")
  private void anyMethod(){}//定义一个切点
  @Before("anyMethod()") 
  public void doSomthing(){   
      System.out.println("前置通知"); 
  }
}

配置文件:

<?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:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
         <aop:aspectj-autoproxy/>
   <bean id="youImpl"class="com.gg.test.aop.YouImpl"></bean>
   <bean id="myInterceptor"class="com.gg.test.aop.MyInterceptor"/>
</beans>

测试:

public class Test {
    publicstatic void main(String[] args) {
  ApplicationContextapplicationContext = newClassPathXmlApplicationContext("aopdemo.xml");
    Youyou = (You)applicationContext.getBean("youImpl");
  you.buyApple();
  }
}

测试结果:

技术分享

如果有参数可用@Before("anyMethod() && args(name)")这种方式表示。



spring注解使用