spring 标注

1、添加支持标注的spring中的jar包:

spring-context.jar

spring-context-support.jar

2、在xml中配置命名空间和schema

<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.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
     
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd">

3、启用基于注解的bean管理和依赖注入DI

    <context:component-scan base-package="com.spring1" />

表示,指定的基包以及子包都会纳入到spring的bean管理中。

4、Bean的注解(以下几种均可)

(1)dao里边的类一般用@Repository

(2)service里边的类一般用@Service

(3)其他的用@Component

aa

Spring mvc中的controller里边的类一般用@Controller

@Repository("dao")
@Scope("prototype")
@Lazy(true)
public class UserDao {
    
    public String showUser(){
            System.out.println("show");
            return "你好";
    }
}

加上了注解,就可以在bean中去掉了。

5、JSR330的注解

需要导入javax.inject.jar

(1)@Named注解,只要加入Named就可以加入bean的管理了。

6、IOC,DI的注解(一下三种选一种均可)

(1)set注入用@AutoWired

    @Autowired
    public void setUserDao(UserDao dao){
        this.userDao = dao;
    }

 (2)将@AutoWired加到被注入的属性上边,可以将set方法去掉

@Named
public class UserService {
    
    @Autowired
    private UserDao userDao;
    
    public void show(){
        userDao.showUser();
    }

}

(3)jsr330中使用@Inject注入方法

@Named
public class UserService {
    
    @Inject
    private UserDao userDao;
    
    public void show(){
        userDao.showUser();
    }

}

(4)jsr250中使用@Resource注入方法

@Named
public class UserService {
    
    @Resource
    private UserDao userDao;
    
    public void show(){
        userDao.showUser();
    }

}

7、AOP注解

首先在xml中加入以下内容,加入aspect切面支持。

<aop:aspectj-autoproxy/>

(1)在切面类上首先用@Named注解或者其他的加入Bean管理,再加上@Aspect注解表示切面类

@Aspect
@Named
public class MyAspect {
    
}

(2)定义切入点表达式,并加入@Pointcut(.......),包,类,方法,参数

@Aspect
@Named
public class MyAspect {
    
    @Pointcut("execution(* com.spring1.dao..*.*(..))")
    public void pointcut(){}
    
}

 (3)定义通知

@Named
@Aspect
public class MyAspect {
    
    @Pointcut("execution(* com.spring1.dao..*.*(..))")
    public void pointcut(){}
    
    @Before("pointcut()")
    public void beforeAdvise(){
        System.out.println("before");
    }
    @AfterReturning(pointcut="pointcut()",returning="o")
    public void afterReturningAdvise(Object o){
        System.out.println("after return");
    }
    
    @After("pointcut()")
    public void afterAdvise(){
        System.out.println("finally");
    }
    @AfterThrowing(pointcut="pointcut()",throwing="e")
    public void afterThrowningAdvise(Exception e){
        System.out.println("throwning");
    }
    
}

(3)仅定义环绕通知

@Named
@Aspect
public class MyAspect {
    
    @Pointcut("execution(* com.spring1.dao..*.*(..))")
    public void pointcut(){}
    
    @Around("pointcut()")
    public void aroundAdvise(ProceedingJoinPoint pjp){
        try{
            System.out.println("after");
            Object object = pjp.proceed();
            System.out.println("after returning");
        }catch(Throwable e){
            System.out.println("after throwning");
        }finally{
            System.out.println("after");
        }
    }
}
原文地址:https://www.cnblogs.com/hpustudent/p/4315891.html