Spring学习笔记之---注解的使用

    注解技术从JDK1.5之后开始推出,之后很多框架开始提供注解配置形式,Spring框架从2.5版本开始支持注解配置,采用注解的优点主要是:简单、快捷
  1)组件扫面功能:Spring 可以按照指定的包路径扫描内部的组件,当发现组件类的定义前有如下注解标记时,
            会自动将该组件纳入到Spring容器:
    a.@Component
    b.@Controller  (Action组件)
    c.@Service   (Service组件)
    d.@Repository (DAO组件)
  2)使用方法:
  注意:注解标记只能用在类、方法、成员变量 的定义之前
    --》 1.在配置文件中开启组件扫描
             
             
    --》 2.在要扫描的组件的类定义前使用上述注解标记
                   首先在要类的定义之前加注解标记:@Repository或其他三种注解标记之一,
           标记时可以指明bean组件的id名,若不指定则默认组件的id为类名首字母小写,
           如果要指定组建的初始化方法和销毁方法,则分别在要指定的相应方法之前分别加上@PostConstruct和@PreDestory注解

    
  (一)、Spring支持的IoC注解:
       如:将com.jeason.dao包下的JdbcCostDAO类扫描到Spring容器,只需要在JdbcCostDAO类的定义之前加如下注解:
               @Repository("jdbcCostDAO") ---  若括号内不指定bean的名称,则默认bean名为类名首字母小写。
               @Scope("prototype")    ---  scope 若不指定则默认为singleton类型
    就相当于xml配置中的:
              
    
    注入:
        假如在上述注解的基础上,再将  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文件下加入如下声明:
     
     
    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  配置文件中的如下配置:
     
     
       
       
         
       

     

你可能感兴趣的:(javaWeb,Spring,IoC,SSH,个人学习笔记,AOP,spring,java,IoC,AOP)