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("最终通知"); } }