• Spring中注解的使用详解


    一:@Rsource注解的使用规则

    1.1.案例演示 

    Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件):

     

    具体业务模块配置文件applicationContext-di-annotation.xml 

    业务类Person.java和Student.java

    ---------------------------------------------------------------------------------------------------------------------------------------

    客户端代码:

    执行结果是:student_annotation 

    1.2.使用总结

    A:@Resource使用规则:

    1.在spring的xml配置文件中导入命名空间及规范。
    xmlns:context="http://www.springframework.org/schema/context"
    http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-2.5.xsd

    2.在spring的xml配置文件中引入注解解析器。

    <context:annotation-config></context:annotation-config> 

    3.在spring的xml配置文件中把bean引入进来。

    4.在一个类的属性上加 

    @Resource(name="student_annotation")  

    public Student student;

    从该注解本身  

    @Target({TYPE, FIELD, METHOD})

    @Retention(RUNTIME)

    public @interface Resource {

    String name() default "";

    }

    可以看出:1.该注解可以用于属性或者方法上,但一般用于属性上。2.该注解的作用范围是runtime。3.该注解有一个属性name,默认值为“”。

    有点要注意@Resource注解只能作用于引用类型的属性上。

    B:加入了注解之后的整个执行过程:

    1.当启动spring容器的时候,spring容器加载了配置文件。

    2.在spring配置文件中,只要遇到bean的配置,就会为该bean创建对象。

    3.在纳入spring容器的范围内查找所有的bean,看哪些bean的属性或者方法上加有@Resource。

    4.找到@Resource注解之后,判断该注解的name属性是否为“”(name没有写)

    如果没有写name属性,则会让属性的名称和spring容器中bean的Id值做匹配,匹配成功则赋值;如果匹配不成功,则按照类型匹配,如果匹配不成功,就报错。

    如果写了name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错。

    C:@Resource与@Autowired 

    @Resource与@Autowired都是做bean的注入时使用。其实@Resource并不是spring的注解,它是jdk扩展包javax.annotation.Resource中的,需要导入使用,但 spring支持该注解的使用。

    1.@Autowired

    @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

    @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。

    如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用 ,如下:

    @Autowired   

    @Qualifier("student_annotation")  等价于 @Resource(name="student_annotation")

    2.@Resource 

    @Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。 @Resource有两个重要的属性:name和type,而Spring将 @Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。 所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则 使用byType自动注入策略。 如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。 



    二:使用注解把一个类放到spring容器中

    2.1.案例演示

    Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件):

     

    具体业务模块配置文件applicationContext-scan-annotation.xml 

    业务类Person.java和Student.java

    -----------------------------------------------------------------------------------------------------------------------------------

    客户端代码:

    执行结果:student_annotation 

    2.2.使用总结 

    A:@Component的使用规则 

    1.在spring的配置文件中导入命名空间及规范

    xmlns:context="http://www.springframework.org/schema/context"
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd

    2.引入类扫描及注解解析器  

    <context:component-scan base-package="com.olymtech.spring.annotation.scan"></context:component-scan>

    a:该注解解析器包含了两个功能:依赖注入和类扫描(包含了<context:annotation-config></context:annotation-config>)

    b:base-package:在该包及子包中扫描 

    3.如果一个类或者接口上(一般都是类上),加了@Component注解,就会进行如下法则:

    如果其value属性的值为“”
    @Component
    public class Person(){
    }
    等价于
    <bean id="person" class="......Person"></bean>(如果value值不写,默认的是类名首字母小写,其他不变)
    如果其value属性的值不为“”
    @Component("p")
    public class Person(){
    }
    等价于
    <bean id="p" class="......Person"></bean>

    4.按照上面的@Resource法则再次进行操作。

    2.3.注解与XML的区别 

    A:注解书写简单,但效率低(应为解析器要扫描类注解,完了再扫描属性注解),但比起网络的效率,它完全可以忽略不计(你服务器效率再高,我提交一个http请求, 咔,网断了,或网络阻塞,服务器效率再高有啥用?) 。

    B:xml书写麻烦,但效率高(不存在扫描)



    三:类扫描注解和依赖注入注解联合使用

    2.1.Document文档读写案例演示

    Spring的置文件:applicationContext-document.xml

    业务类:Document接口,DocumentManager类,ExcelDocument类,PdfDocument类,WordDocument类

    ------------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------------------------

    --------------------------------------------------------------------------------------------------------------------------

    --------------------------------------------------------------------------------------------------------------------------------------

    客户端代码:

    执行结果:read word

          writer word



    2.2.模仿web的MVC案例演示

    Spring的置文件:applicationContext-mvc.xml

     

    业务类:

    控制层:

     

    服务层:

    -----------------------------------------------------------

    持久层:

    --------------------------------------------------------

    客户端代码:

    执行结果:save person dao





    四:spring中关于类扫描注解和依赖注入注解的归纳总

    Spring 2.5引入了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。 @Component是所有受Spring管理组件的通用形式; 而@Repository、@Service和 @Controller则是@Component的细化, 用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。也就是说, 你能@Component来注解你的组件类, 但如果用@Repository、@Service 或@Controller来注解它们,你的类也许能更好地被工具处理,或与切面进行关联。 例如,这些典型化注解可以成为理想的切入点目标。当然,在Spring Framework以后的版本中, @Repository、@Service和 @Controller也许还能携带更多语义。 如此一来,如果你正在考虑服务层中是该用 @Component还是@Service, 那@Service显然是更好的选择。 同样的,就像前面说的那样, @Repository已经能在持久化层中进行异常转换时被作为标记使用了。

    -----------常用注解--------

    --定义Bean的注解(类扫描注解)

    @Controller

    @Controller("Bean的名称")

    定义控制层Bean,如Action

     

    @Service          

    @Service("Bean的名称")

    定义业务层Bean

     

    @Repository   

    @Repository("Bean的名称")

    定义DAO层Bean

     

    @Component  

    定义Bean, 不好归类时使用.

    --自动装配Bean (依赖注入注解;选用一种注解就可以)

    @Autowired  (Srping提供的)

    默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上

     

    @Autowired(required=true)  

    一定要找到匹配的Bean,否则抛异常。 默认值就是true 

     

    @Autowired

    @Qualifier("bean的名字") 

    按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。

     

    @Resource   JSR-250提供的

    默认按名称装配,当找不到名称匹配的bean再按类型装配.

    可以写在成员属性上,或写在setter方法上

    可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.

    @Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.

     

    @Inject   是JSR-330提供的

    按类型装配,功能比@Autowired少,没有使用的必要。

    --定义Bean的作用域和生命过程

    @Scope("prototype")

    值有:singleton,prototype,session,request,session,globalSession

     

    @PostConstruct 

    相当于init-method,使用在方法上,当Bean初始化时执行。

     

    @PreDestroy 

    相当于destory-method,使用在方法上,当Bean销毁时执行。

     

    --声明式事务

    @Transactional  





  • 相关阅读:
    Cannot change version of project facet Dynamic web module to 3.0
    mybatis
    mybatis逆向工程工具
    mybatis和jdbc分析
    分析mybatis和jdbc的作用,已经原理
    JDBC使用步骤
    MyBatis架构设计及源代码分析系列(一):MyBatis架构
    MyBatis的foreach语句详解
    vue.js使用elemnetUi
    vue.js路由嵌套传参
  • 原文地址:https://www.cnblogs.com/vanl/p/5614711.html
Copyright © 2020-2023  润新知