Spring学习笔记之---注解的使用
2016-05-12 13:32
127 查看
注解技术从JDK1.5之后开始推出,之后很多框架开始提供注解配置形式,Spring框架从2.5版本开始支持注解配置,采用注解的优点主要是:简单、快捷
1)组件扫面功能:Spring 可以按照指定的包路径扫描内部的组件,当发现组件类的定义前有如下注解标记时,
会自动将该组件纳入到Spring容器:
a.@Component
b.@Controller (Action组件)
c.@Service (Service组件)
d.@Repository (DAO组件)
2)使用方法:
注意:注解标记只能用在类、方法、成员变量 的定义之前
--》1.在配置文件中开启组件扫描
<!-- 配置Spring注解自动扫描(spring注解<自定义注解不行>) -->
<context:component-scan base-package="com.tarena" />
--》2.在要扫描的组件的类定义前使用上述注解标记
首先在要类的定义之前加注解标记:@Repository或其他三种注解标记之一,
标记时可以指明bean组件的id名,若不指定则默认组件的id为类名首字母小写,
如果要指定组建的初始化方法和销毁方法,则分别在要指定的相应方法之前分别加上@PostConstruct和@PreDestory注解
(一)、Spring支持的IoC注解:
如:将com.jeason.dao包下的JdbcCostDAO类扫描到Spring容器,只需要在JdbcCostDAO类的定义之前加如下注解:
@Repository("jdbcCostDAO") --- 若括号内不指定bean的名称,则默认bean名为类名首字母小写。
@Scope("prototype") --- scope 若不指定则默认为singleton类型
就相当于xml配置中的:
<bean id="jdbcCostDAO" class="com.jeason.dao.JdbcCostDAO" scope="prototype" />
注入:
假如在上述注解的基础上,再将 com.jeason.action 包中的 DeleteAction 类扫描到Spring容器,就在该类的定义之前加如下注解标记:
@Controller("deleteAction")
@Scope("prototype") //指定该bean实例化时采用 prototype 方式
然后将上述的jdbcCostDAO组件注入给DeleteAction类中的CostDAO属性,
只需要在该成员变量的声明之前,或者该成员变量的setXXX()方法之前加上注解配置,如下:
@Controller
@Scope("prototype")
public class DeleteAction {
@Resource(name="jdbcCostDAO") //注入注解
private CostDAO costDao;
......
}
这里需要注意:@Resource如果不指定 name,则默认按照容器中相同类型的组件为CostDAO属性注入,
按照类型匹配的注入方式还有另外一个注解也可以实现这个功能,@Autowired 使用方法与@Resource注解相同
当使用 @Autowired 注解也想指定 name 时,可以在该注解下面加入 @Qualifier("name")
@Resource 注解的实现类是 javax.annotation.包下的 Resource 类;
而@Autowired 和 @Qualifier 注解是由spring框架提供的功能,实现类分别是 org.springframework.beans.factory.annotation包下的Autowired 类 和 Qualifier类
(二)、Spring支持的AOP注解:
1.首先,要使用AOP特性的注解功能,需要先在配置文件中 开启AOP的注解功能,在applicationContext.xml文件下加入如下声明:
<!-- 开启AOP注解功能 -->
<aop:aspectj-autoproxy />
2.AOP注解功能的使用:
将某个组件定义为方面组件,先将该类扫描到Spring容器后,再在该类的定义之前加@Aspect注解,如下,假如下面的LoggerBean类在com.jeason.bean包下:
@Component("loggerBean")
@Aspect //将该组件定义为方面组件
public class LoggerBean {
/* 定义方法的目的是使用@Pointcut注解,这里需要为该@Pointcut定义一个方法
* 这里是将com.jeason.action包及其子包下的所有组件都声明为目标组件
* @Pointcut()括号里面即为xml配置里的 expression语句
* pointcut的id默认为方法名,即这里的mypoint()
* 一个切入点声明有两个部分:一个包含名字和任意参数的签名,还有一个切入点表达式
* 切入点签名通过一个任意参数普通的方法定义来提供,且签名方法的返回类型必须为void
*/
@Pointcut("within(com.jeason.action..*)")
public void mypoint(){} //Pointcut 的singnature (签名方法)
/**
* 定义通知,关联方面组件和目标组件,指定 pointcut-ref 为 "myPoint()"
* 这里采用Around通知类型,指定logger()方法为通知方法
* 通知注解还有其他几种对应的类型:@Before,@AfterReturning,@AfterThrowing,@After
* @After注解在使用时稍有不同,它可以这样写:@After(pointcut="",throwing="")
* 注:这里@Around("这里可以直接写Pointcut的expression表达式")
* */
@Around("myPoint()")
public Object logger(ProceedingJoinPoint pjp) throws Throwable{
......
}
}
这一段注解也就相当于在 applicationContext.xml 配置文件中的如下配置:
<bean id="loggerBean" class="com.jeason.bean.LoggerBean">
<aop:config>
<aop:pointcut id="myPoint" expression="within(com.jeason.action..*)" />
<aop:aspect id="loggerAspect" ref="loggerBean">
<aop:around pointcut-ref="myPoint" method="logger" />
</aop:aspect>
</aop:config>
1)组件扫面功能:Spring 可以按照指定的包路径扫描内部的组件,当发现组件类的定义前有如下注解标记时,
会自动将该组件纳入到Spring容器:
a.@Component
b.@Controller (Action组件)
c.@Service (Service组件)
d.@Repository (DAO组件)
2)使用方法:
注意:注解标记只能用在类、方法、成员变量 的定义之前
--》1.在配置文件中开启组件扫描
<!-- 配置Spring注解自动扫描(spring注解<自定义注解不行>) -->
<context:component-scan base-package="com.tarena" />
--》2.在要扫描的组件的类定义前使用上述注解标记
首先在要类的定义之前加注解标记:@Repository或其他三种注解标记之一,
标记时可以指明bean组件的id名,若不指定则默认组件的id为类名首字母小写,
如果要指定组建的初始化方法和销毁方法,则分别在要指定的相应方法之前分别加上@PostConstruct和@PreDestory注解
(一)、Spring支持的IoC注解:
如:将com.jeason.dao包下的JdbcCostDAO类扫描到Spring容器,只需要在JdbcCostDAO类的定义之前加如下注解:
@Repository("jdbcCostDAO") --- 若括号内不指定bean的名称,则默认bean名为类名首字母小写。
@Scope("prototype") --- scope 若不指定则默认为singleton类型
就相当于xml配置中的:
<bean id="jdbcCostDAO" class="com.jeason.dao.JdbcCostDAO" scope="prototype" />
注入:
假如在上述注解的基础上,再将 com.jeason.action 包中的 DeleteAction 类扫描到Spring容器,就在该类的定义之前加如下注解标记:
@Controller("deleteAction")
@Scope("prototype") //指定该bean实例化时采用 prototype 方式
然后将上述的jdbcCostDAO组件注入给DeleteAction类中的CostDAO属性,
只需要在该成员变量的声明之前,或者该成员变量的setXXX()方法之前加上注解配置,如下:
@Controller
@Scope("prototype")
public class DeleteAction {
@Resource(name="jdbcCostDAO") //注入注解
private CostDAO costDao;
......
}
这里需要注意:@Resource如果不指定 name,则默认按照容器中相同类型的组件为CostDAO属性注入,
按照类型匹配的注入方式还有另外一个注解也可以实现这个功能,@Autowired 使用方法与@Resource注解相同
当使用 @Autowired 注解也想指定 name 时,可以在该注解下面加入 @Qualifier("name")
@Resource 注解的实现类是 javax.annotation.包下的 Resource 类;
而@Autowired 和 @Qualifier 注解是由spring框架提供的功能,实现类分别是 org.springframework.beans.factory.annotation包下的Autowired 类 和 Qualifier类
(二)、Spring支持的AOP注解:
1.首先,要使用AOP特性的注解功能,需要先在配置文件中 开启AOP的注解功能,在applicationContext.xml文件下加入如下声明:
<!-- 开启AOP注解功能 -->
<aop:aspectj-autoproxy />
2.AOP注解功能的使用:
将某个组件定义为方面组件,先将该类扫描到Spring容器后,再在该类的定义之前加@Aspect注解,如下,假如下面的LoggerBean类在com.jeason.bean包下:
@Component("loggerBean")
@Aspect //将该组件定义为方面组件
public class LoggerBean {
/* 定义方法的目的是使用@Pointcut注解,这里需要为该@Pointcut定义一个方法
* 这里是将com.jeason.action包及其子包下的所有组件都声明为目标组件
* @Pointcut()括号里面即为xml配置里的 expression语句
* pointcut的id默认为方法名,即这里的mypoint()
* 一个切入点声明有两个部分:一个包含名字和任意参数的签名,还有一个切入点表达式
* 切入点签名通过一个任意参数普通的方法定义来提供,且签名方法的返回类型必须为void
*/
@Pointcut("within(com.jeason.action..*)")
public void mypoint(){} //Pointcut 的singnature (签名方法)
/**
* 定义通知,关联方面组件和目标组件,指定 pointcut-ref 为 "myPoint()"
* 这里采用Around通知类型,指定logger()方法为通知方法
* 通知注解还有其他几种对应的类型:@Before,@AfterReturning,@AfterThrowing,@After
* @After注解在使用时稍有不同,它可以这样写:@After(pointcut="",throwing="")
* 注:这里@Around("这里可以直接写Pointcut的expression表达式")
* */
@Around("myPoint()")
public Object logger(ProceedingJoinPoint pjp) throws Throwable{
......
}
}
这一段注解也就相当于在 applicationContext.xml 配置文件中的如下配置:
<bean id="loggerBean" class="com.jeason.bean.LoggerBean">
<aop:config>
<aop:pointcut id="myPoint" expression="within(com.jeason.action..*)" />
<aop:aspect id="loggerAspect" ref="loggerBean">
<aop:around pointcut-ref="myPoint" method="logger" />
</aop:aspect>
</aop:config>
相关文章推荐
- JAVA随机数之多种方法从给定范围内随机N个不重复数
- 【JAVA】运算符与逻辑运算符
- SpringMVC 处理过程
- Java学习笔记(八):集合类
- RxJava flatmap
- Java调用DLL
- Java SpringMVC实现国际化整合案例分析(i18n)
- 深入浅出: Java回调机制(异步)
- Spring Security 学习笔记-授权控制过滤器
- 实时 Java 社区论坛:Sym
- Spring IOC(依赖注入,getBean)
- Java 性能调优指南之 Java 集合概览
- Java 性能调优指南之 Java 集合概览
- Java 的 JSON 开源类库选择比较
- 【DAY3】JAVA面向对象和函数
- Java多线程---从线程中返回数据
- 深入Spring:自定义IOC
- Java中HashMap遍历的两种方式
- SpringMVC表单提交Action的路径问题
- java如何在函数中调用主函数的数组