您的位置:首页 > 编程语言 > Java开发

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: