学习笔记
从 Java 5 开始增加了对注解的支持,Spring 从 2.5 版本开始提供了对注解技术的全面支持,简化 Spring 的 XML 配置.
一、 容器:IOC
1. Spring Bean
这些注解直接标注在Java类上,将它们定义为 Spring Bean。
- @Component
描述Spring中的Bean,它是一个泛化的概念,表示一个组件,可以用在任何层次。 - @Repository
将Dao层的类标识为Spring中的Bean。 - @Service
将Service层的类标识为Spring中的Bean。 - @Controller
将Controller层的类标识为Spring中的Bean。
2. 自动注入
- @Autowired
根据类型进行转配
@Autowired
private UserDao userDao;
@Autowired
private UserService userService;
- @Qualifier(“Bean”)
与@Autowird配合使用,根据名称进程装配
@Autowired
@Qualifier("userDaoImpl") // 指定bean的名字
private UserDao userDao;
- Resource
默认根据名称装配ByName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
在使用Spring Bean注解时,给定Bean一个Name,该Name与Resource的name属性对应。
@Repository("myUserDao") //将UserDaoImpl类命名为myUserDao
public class UserDaoImpl implements UserDao {
...
}
@Service
public class UserServiceImpl implements UserService {
@Resource(name = "myUserDao") // 在Servic层使用Resource注解注入UserDaoImpl,如果未注明name ,则按照属性名(myUserDao)查找
private UserDao myUserDao;
...
}
}
3. Spring 全注解开发
全注解开发就是不再使用Spring配置文件,写一个配置类来代替配置文件。
- @Configuration
- @ComponentScan
@Configuration
//@ComponentScan({"com.atguigu.spring6.controller", "com.atguigu.spring6.service","com.atguigu.spring6.dao"})
@ComponentScan("com.atguigu.spring6") //注明扫描范围
public class Spring6Config {
}
二、面向切面:AOP
1. 创建切面类并配置
- @Aspect
表示这个类是一个切面类
// @Aspect表示这个类是一个切面类
@Aspect
// @Component注解保证这个切面类能够放入IOC容器
@Component
public class LogAspect {
...
}
2. 通知
- 前置通知:使用**@Before**注解标识,在被代理的目标方法前执行
- 返回通知:使用**@AfterReturning**注解标识,在被代理的目标方法成功结束后执行
- 异常通知:使用**@AfterThrowing**注解标识,在被代理的目标方法异常结束后执行
- 后置通知:使用**@After**注解标识,在被代理的目标方法最终结束后执行
- 环绕通知:使用**@Around**注解标识,使用try…catch…finally结构围绕整个被代理的目标方法,包括上面四种通知对应的所有位置
3. 重用切入点表达式
- 声明
@Pointcut("execution(* com.atguigu.aop.annotation.*.*(..))")
public void pointCut(){}
在同一个切面中使用@Before(“pointCut()”)
在不同切面中使用@Before(“com.atguigu.aop.CommonPointCut.pointCut()”)
- 切面优先级
@Order(n) :n越小优先级越高
三、 测试
1. JUnit5
//两种方式均可
//方式一
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:beans.xml")
//方式二
@SpringJUnitConfig(locations = "classpath:beans.xml")
public class SpringJUnit5Test {
...
}
}
beans.xml 文件如下
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.atguigu.spring6.bean"/>
</beans>
2. JUnit4
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class SpringJUnit4Test {
...
}
}
beans.xml文件与JUnit5相同