• 使用spring注解@Controller @Service @Repository简化配置


    前言:在web项目中引入spring框架中的配置文件,我们给每一个java bean进行相关配置可以非常安全,便捷的管理我们的bean。那么,问题来了,如果一个项目中所涉及到的java bean十分庞大,而且每一个bean中的配置都是大同小异的,那么这份applicationContext.xml文件恐怕是无能为力了。接下来,我们使用spring的注解便可以很好的解决这一问题。

    首先:我们浏览一下我们原始的applicationContext.xml中的部分配置

     1   <bean id="myNewsAction" class="news.action.NewsAction" scope="prototype">
     2         <property name="ns" ref="myNewsService"></property>
     3     </bean>
     4     
     5     <bean id="myNewsService" class="news.service.NewsServiceImpl" scope="prototype">
     6         <property name="nd" ref="myNewsDao"></property>
     7     </bean>
     8     
     9     <bean id="myNewsDao" class="news.dao.NewsDaoImpl" scope="prototype">
    10         <property name="sf" ref="mySessionFactory"></property>
    11     </bean>

    解析:在这个代码段中我们可以看出,我们的控制器也就是我们的action访问的是我们的service层,而service层则是访问的数据层dao。在这种传统的写法中每个类有什么属性要注入非常明显,而今天我们要做的就是要简化这份配置文件。

    接下来:如果我们把这份配置文件简化成这样

    1     <bean id="myNewsAction" class="news.action.NewsAction" scope="prototype"></bean>
    2     
    3     <bean id="myNewsService" class="news.service.NewsServiceImpl" scope="prototype"></bean>
    4     
    5     <bean id="myNewsDao" class="news.dao.NewsDaoImpl" scope="prototype"></bean>    

    解析:我们只是绑定了每个bean,但是并没有为其注入属性。其实我们是用到了spring的@Autowired,@Qualifier这两个注解

    1     @Autowired
    2     @Qualifier("mySessionFactory")
    3     private SessionFactory sf;    

    解析:在@Qualifier这个注解中我们申明其引用的是哪一个bean,spring便会自动为其注入这个实例,并且属性的set方法也可省略

    但是:经过上面的一番操作仿佛没有给我省多少事,别急,认真看完本篇博客的人才知道有用的东西在最后。哈哈哈!

     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" xmlns:p="http://www.springframework.org/schema/p"
     4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation="    
     7             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
     8             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
     9             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    10             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd  
    11             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    12 
    13     <!-- 基于news这个包自动扫描其中的类 ,也会自动注入解析器-->
    14     <context:component-scan base-package="news"></context:component-scan>
    15 
    16     <!-- 引入外部属性文件 -->
    17     <context:property-placeholder location="classpath:jdbc.properties" />
    18 
    19     <bean id="mySessionFactory"
    20         class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    21     </bean>
    22 
    23     <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    24         
    25     </bean>
    26         
    27 </beans>
    28     

    解析:从这份applicationContext.xml文件中我们可以明显的看到我们压根没有给我们的java bean进行相关配置,只是配置了一些基本的数据源。唯一多了一行

    <context:component-scan base-package="news"></context:component-scan>通过这个节点的base-package属性可以配置spring需要自动注入的哪个基包。
    此时便是spring的@Controller @Service @Repository这三个注解起作用的时候了
    1 @Controller("myNewsAction")
    2 @Scope("prototype")
    3 public class NewsAction extends ActionSupport {
    4     
    5     @Autowired
    6     @Qualifier("myNewsService")
    7     private NewsService ns;
    1 @Service("myNewsService")
    2 @Scope("prototype")
    3 public class NewsServiceImpl implements NewsService {
    4 
    5     @Autowired
    6     @Qualifier("myNewsDao")
    7     private NewsDao nd;
    1 @Repository("myNewsDao")
    2 @Scope("prototype")    
    3 public class NewsDaoImpl implements NewsDao {
    4     
    5     @Autowired
    6     @Qualifier("mySessionFactory")
    7     private SessionFactory sf;

    解析:①,注解@Controller为我们的控制器action类的类注解相当于applicationContext.xml文件中的bean节点,而括号中的值相当于bean节点中的id属性的属性值。同理:@Service为我们业务层的类注解,@Repository为数据层dao的类注解。

    ②,注解 @Scope("prototype") 相当于applicationContext.xml文件中bean节点中scope属性,这个非单例模式注解十分重要,主要起到线程安全,防止并发操作时出现异常的作用

    小结:使用spring的类注解和属性注解确实能给我们带来许多便利,关于类属性的注解其实jdk javax.annotation.Resource包中便有@Resource注解。所以,我们当然也可以选择使用jdk的注解,不过要注意的是,千万不要把jdk的注解和spring的注解混用。在软件系统中,由于原生的jdk难免存在一些缺陷,我们在开发过程中往往需要引入各种框架,因此我们的项目便不得不与这些框架耦合在一起。虽然我们一直不希望我们的代码出现耦合,毕竟这只是一种理想状态。总之,轻度耦合一直是我们追求的代码风格。

  • 相关阅读:
    BZOJ5308 ZJOI2018胖
    BZOJ5298 CQOI2018交错序列(动态规划+矩阵快速幂)
    423. Reconstruct Original Digits from English
    422. Valid Word Square
    277. Find the Celebrity
    419. Battleships in a Board
    414. Third Maximum Number
    413. Arithmetic Slices
    412. Fizz Buzz
    285. Inorder Successor in BST
  • 原文地址:https://www.cnblogs.com/1016882435AIDA/p/5967358.html
Copyright © 2020-2023  润新知