首页 > 代码库 > 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/>
这个配置隐式注册了多个对注释进行解析处理的处理器
AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
三、用来装配的注解
@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的销毁方法
四、扫描:
在大型项目中,通常会有上百至上千个组件,如果这些组件都采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。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注解使用