zoukankan      html  css  js  c++  java
  • 注解的使用

    注解的作用:spring容器是通过把java类注册成bean进行管理的,把java类变成bean有两种方式,一种是通过xml文件进行配置,把需要的类注册成bean,
    还有一种方式就是注解,注解的方式只需要在需要的类前边加上注解,spring扫描到注解就能把被注解的类自动注册成bean,不同的注解可以被注册成不同的bean,
    相对于xml配置,使用注解更为方便快捷。也因此越来越多的框架都支持注解配置而放弃xml配置。所以总得来说,注解的作用就是代替手动配置吧,只需要在适当的位置标注一下,就能让框架自己完成具体的配置过程。



    首先,在applicationContext.xml文件中加一行: <context:component-scan base-package="com.hzhi.clas"/> 加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。 比如下面这个类: 复制代码 @Service("courseDAO") @Scope("prototype") public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{ ...... } 复制代码 其作用就相当于applicationContext.xml文件里面的: <bean id="courseDAO" class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype"> ...... </bean>


    Spring注解@Component、@Repository、@Service、@Controller区别

    标签: springserviceautowiredbeandao
    分类:

    很长时间没做web项目都把以前学的那点框架知识忘光了,今天把以前做的一个项目翻出来看一下发现用·@Component标记一个组件,而网上有的用@Service标记组件,我晕就查了一下资料:

    spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。
    在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。
    虽然目前这3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。
    所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用上述注解对分层中的类进行注释。

    @Service用于标注业务层组件

    @Controller用于标注控制层组件(如struts中的action)

    @Repository用于标注数据访问组件,即DAO组件

    @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

    1. @Service  
    2. public class VentorServiceImpl implements iVentorService {     
    3. }  
    4. @Repository  
    5. public class VentorDaoImpl implements iVentorDao {   
    6. }  

    在一个稍大的项目中,如果组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。
    Spring2.5为我们引入了组件自动扫描机制,他在类路径下寻找标注了上述注解的类,并把这些类纳入进spring容器中管理。
    它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息:

    代码

    1. <?xml version="1.0" encoding="UTF-8" ?>   
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xmlns:context="http://www.springframework.org/schema/context"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    6.                 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    7.         http://www.springframework.org/schema/context  
    8.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">   
    9.      
    10.     <context:component-scan base-package=”com.eric.spring”>     
    11. </beans>   

    1.component-scan标签默认情况下自动扫描指定路径下的包(含所有子包),将带有@Component、@Repository、@Service、@Controller标签的类自动注册到spring容器。对标记了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的类进行对应的操作使注解生效(包含了annotation-config标签的作用)。

    getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定。
    这种bean默认是“singleton”的,如果想改变,可以使用@Scope(“prototype”)来改变。

    可以使用以下方式指定初始化方法和销毁方法:

    1. @PostConstruct  
    2. public void init() {   
    3. }   
    4. @PreDestroy  
    5. public void destory() {   
    6. }   


     

    注入方式:

    把DAO实现类注入到action的service接口(注意不要是service的实现类)中,注入时不要new 这个注入的类,因为spring会自动注入,如果手动再new的话会出现错误,
    然后属性加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。  

    在接口前面标上@Autowired注释使得接口可以被容器注入,如:

    1. @Autowired  
    2. @Qualifier("chinese")  
    3. private Man man;   

    当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类,否则可以省略,只写@Autowired。

    用@Resource注解完成属性装配

    使用Field注入(用于注解方式):注入依赖对象可以采用手工装配或者手工自动装配。在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

    依赖注入—手工装配

    手工装配依赖对象,在这种方式中又有两种编程方式。

    1.在xml配置文件中,通过bean节点配置,如:

    1 <bean id="orderService" class="cn.itcast.service.OrderServiceBean">
    2     //构造器注入
    3     <constructor-arg index="0" type="java.lang.String" value="xxx"/>
    4     //属setter方法注入
    5     <property name="name" value="zhao"/>
    6 </bean>

    2.在java代码中使用@Autowired或者@Resource注解方式进行装配。但我们需要在xml配置文件中配置一下信息

    1  <beans Xmlns="http://www.springframework.org/schema/beans"
    2              Xmlns="http://www.w3.org/2001/XMLSchema-instance"
    3              Xmlns:context="http://www.springframework.org/schema/context"
    4              Xsi:schemaLocation="http://www.springframework.org/schema/beans
    5                          http://www.springframework.org/schema/context
    6                          http://www.springframework.org/schema/context/spring-context-2.5xsd">
    7 </beans>

    这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor

    PersistenceAnnotationBeanProcessor,RequiredAnnotationBeanPostProcessor

    3.区别

    在java代码中使用@Autowired或@Resource注解方式进行装配。这两个注解的区别是@Autowired默认按类型装配@Resource默认按名称进行装配,当找不到与名称匹配的bean才会按类型装配

    1 @Autowired
    2 private PersonDao personDao;//用于字段上
    3 @Autowired
    4 public void setOrderDao(OrderDao orderDao){
    5        this.orderDao = orderDao; //用于属性的setter方法上      
    6 }

    @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false;如果我们想使用名称装配,可以结合@Qualfier注解一起使用,如下:

    @Autowired@Qualifier("personDao")
    private PersonDao personDao;

    @Resource注解和@Autowired一样,可以标注在字段或者属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定;如果没有指定name属性,当注解标注在字段上,即默认字段的名称作为bean名称寻找依赖对象;当注解标注在属性setter方法上,即默认取属性名作为bean名称寻找依赖对象

    @Resource(name="personDaoBean")
    private PersonDao personDao;

    注:如果没有指定name属性,并且按照默认的名称仍找不到对象时,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

    1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。 
    2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下: 

    1. @Autowired() @Qualifier("baseDao")     
    2. private BaseDao baseDao;    

     3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 
    如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    1. @Resource(name="baseDao")     
    2. private BaseDao baseDao;    

     
    我喜欢用 @Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。

     

     

    。。。。。。。。。。。。。。。。。。。。。。。。。。。

     

    什么时候用@Resource,什么时候用@service

     

     

     

    Spring中什么时候用@Resource,什么时候用@service

    当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义为一个bean,bean名称为XXX;

    当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值或注入时在该属性上一行使用@Resource(name="xxx"),相当于为该属性注入一个名称为xxx的bean。

    ===================================================================================================

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
      @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
      @Resource装配顺序
      1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
      2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
      3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
      4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

     。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
     

    @RequestMapping():为控制器类或者方法指定一个映射的路径,也就是说控制器类或者方法所对应的url,之后就可以通过@RequestMapping()注解指定的路径来访问到对应的类或方法。使用格式是:

     @RequestMapping(value=”/login”)

    一般来说,/后边的值保持和类或者方法同名,当然用别的名字也可以。@RequestMapping()还支持使用参数method限定被请求的方式,例如:

    @RequestMapping(value="/getName", method = RequestMethod.GET)



    , @Controller

    用来标记控制类


    2, @RequestMapping()

    用来标记在controller类上或者方法上,做地址映射


    3, @Autowired
    注释在成员变量上spring就会将其以Byname的形式自动化注入到spring容器中,因此便省去了get/set方法和spring配置文件的配置


    4, @Service
    标记业务逻辑层Bean


    5,  @Resource

    这个注解不属于spring,是J2EE的注解;注解与@Autowried的使用方法一样,但是建议使用@Resource。


    @Resource与@Autowried的不同就是@Autowried是是通过Bytype的方式注入spring的,而@Resource是通过Byname或Bytype方式注入spring的。@Resource有两个重要的属性分别是name和type,spring将属性name解析为bean的名字,而将type属性解析成bean的类型。如果使用name属性就是使用Byname自动注入策略,如果使用type属性就是使用Bytype自动修护乳策略,如果即不指定name也不指定type,那么spring就通过反射机制使用Byname自动注入策略。如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;


    6,@Transational
       标记该方法是事务执行的;



    7,@Repository
    标记数据访问层Bean

    Spring系列之Spring常用注解总结

     https://www.cnblogs.com/xiaoxi/p/5935009.html

  • 相关阅读:
    netty 服务端 启动阻塞主线程
    idea踩过的坑
    bat批量重命名
    图片上传
    TCP/IP入门指导
    CPU governor调节器汇总
    IT咨询顾问:一次吐血的项目救火
    python 数组
    Python字符串
    基于Python实现对各种数据文件的操作
  • 原文地址:https://www.cnblogs.com/mybatis/p/6688445.html
Copyright © 2011-2022 走看看