注解配置
Spring不会自动寻找注解,需主动声明需要在哪些包中寻找注解
修改配置文件:
添加工作空间:xmlns:context和xsi:schemaLocation
声明注解在的包:
<context:component-scan base-package="包名,包名"/>
常用注解
将对象交予容器管理
①@Component("") 相当于<bean/>,括号内为该对象在容器中的id,默认首字母小写
②@Service与@Component功能相同,一般用于ServiceImpl上
③@Respoitory与@Component功能相同,一般用于数据访问层
④@Controller与@Component功能相同,一般用于控制器,被SpringMVC容器管理
例,通过.getBeanDefinitionNames()方法检测:
可以发现,除了我们自己用注解交给容器管理的对象外,还有一些扫描注解依赖的对象
注入属性值
⑤@Resource java中的注解,默认按照byName,若无名称,则按照byType
使用在属性之上,并且不需要属性的set方法,建议把属性名称和引用名相同,提高寻找效率
⑥@Autowired spring的注解,默认按照byType,并且不需要属性的set方法
⑦@Value()获取properties文件中的内容
例:
注解基于Aspect实现 AOP
前提:
<!-- 设置注解完成AOP -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
①对于切点,在方法前加@Pointcut(“execution(* 包名.类名.方法名())”),相当于<pointcut/>
②前置通知,通知方法类前加@Aspect与@Component,具体方法前加@Before(“切点的包名.类名.方法名()”)
③其他同前置,后置(@After),异常(@AfterThrowing),环绕(@Around)
若环绕和前后置同时配置,环绕一般在前置/后置之前
Ps:此处需要注意的是,Spring AOP默认使用的是JDK动态代理,而我们设置的通知方法类若不是继承自接口的话,需修改动态代理方式为CGLIB:
需要在配置文件进行修改:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!--true:cglib动态代理,false:jdk动态代理(默认值,此时需要接口来获取代理对象)-->
例: