spring Annotation

使用注解替代xml

在前几章的笔记基础上添加使用注解的形式

1.配置applicationContext 添加context schema

<?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"
       <!-- 这一句 -->
       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"
>

<!-- 注解只需要这一句.指的是组件扫描开始的包,我们就写总包,从这个包及其子包 -->
    <context:component-scan base-package="com.kaishengit"/>
    <!-- aop注解还要添一句 -->
    <aop:aspectj-autoproxy/>
    

</beans>

2.Bean的注解()

这三个注解用哪个都一样,但是人为规定dao的用Repository,service的用Service,其他用Component
@Component(组件)
@Service(服务)
@Repository (存储,持久化)

---------------------------------------------

然后这就行了?

没有这句话啊<bean id="userDao" class="com.kaishengit.dao.UserDao"></bean>
怎么做到的?注意,默认的就是跟类型相同,首字母小写
不一样的时候@Repository("xxx")

@Repository
public class UserDao implements IUserDao {
}

@Repository
@Scope("prototype")// 单例
public class UserDao implements IUserDao {
}

@Repository
@Lazy(true)// lazy
public class UserDao {}

=======================================================================

=======================================================================

JSR 330 Standard Annotation这个组织 定义了注解@Named好处是sun官方的
跟上面三个功能一样

导入javax.inject.jar(源自JavaEE6)
import javax.inject.Named;

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

然后就可以使用named代替上面的三个注解

@Named
public class UserDao {}

--------------------------------------------------------
--------------------------------------------------------

 解决ioc,依赖注入

IOC Annotation
@Autowired
@Inject
@Resource

//首先是bean管理 
@Named
public class UserService {
/*依赖注入,首先是byName(,默认属性名首字母小写),找不到就byType,然后不需要写set*/
    @Autowired
    private IUserDao userDao;
    
    public void save() {
        userDao.save();
    }
    
    public void find() {
        userDao.findName();
    }

    
}

JSR 330就可以用@inject注入
@Inject
private UserDao userDao;

========================================================

========================================================

aop注解 

导入jar

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>3.2.0.RELEASE</version>
</dependency>

配置中添加一句

<aop:aspectj-autoproxy/>
@Aspect//等同于<aop:aspect ref="myAspect">
@Named
public class MyAspect {
/*定义切入点表达式,随便定义一个方法,不需要有内容什么的,主要是能在这个方法上面加注解
        */
    @Pointcut("execution(* com.kaishengit.dao..*.*(..))")
    public void pointcut(){}
    /*指定方法很简单,因为我在哪个方法上面加就是指定哪个方法
         指定接入点表达式就是写上面定义切入点表达式的那个方法*/
    @Before("pointcut()")
    public void beforeAdvice() {
        System.out.println("前置通知....");
    }
    
    @AfterReturning(pointcut="pointcut()",returning="obj")
    public void afterAdvice(Object obj) {
        System.out.println("后置通知..." + obj);
    }
    
    @AfterThrowing(pointcut="pointcut()",throwing="ex")
    public void exceptionAdvice(Exception ex) {
        System.out.println("异常通知..." + ex.getMessage());
    }
    
    @After("pointcut()")
    public void finallyAdvice() {
        System.out.println("最终通知....");
    }
    
    
    
    // 这是环绕通知,用于替代上面四个通知
    @Around("pointcut()")
    public void aroundAdvice(ProceedingJoinPoint jp) {
        
        try {
            System.out.println("前置通知");
            Object obj = jp.proceed();
            System.out.println("后置通知");
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常通知");
        } finally {
            System.out.println("最终通知");
        }
        
    }
    
原文地址:https://www.cnblogs.com/itliucheng/p/4465231.html