Annotation——Spring注解开发

    xiaoxiao2021-03-25  104

             spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射。通常情况下我们会在xml配置文件中进行action,service,dao等层的声明,然后并告知框架我们想要的注入方式,然后在类中声明要组合类的getset方法。而通过Spring框架中注解的运用也就主要是解决这类问题的。而框架中另一个核心知识AOP,一种面向横切面的方法编程,在程序中一般都是进行一次设置就可以的,所以都还放在配置文件中。例如声明式事物的设置,一次设置,后边我就不用管了,所以这个没有必要使用注解进行简化。因为工作量都差不多。好了,看一下在Spring中如何使用注解进行开发吧!

     

               一,首先需要在配置文件中增加命名空间的和约束文件:

    [html]  view plain  copy  print ? <beans ...           xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="           ...           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd           ">  

             二,开启Spring的注解功能,这样Spring环境才会进行指定位置的扫描,进行类之间的关联组合:

    [html]  view plain  copy  print ? <!-- 扫描注解类       base-package : 表示当前扫描的包,框架会根据包查找所有使用注解的类    -->   <context:component-scan base-package="com.ljh.spring.*" />  

             三,声明注解类,让Spring框架可以识别:

                1,类的分层注解,由于我们后台开发都是分为三层进行开发的,所以Spring框架提供了三种对于不同层的注解方式:

                   控制层:@Controller

                   服务层:@Service

                   持久层:@Repository

     

                类似于我们配置文件中的:

    [html]  view plain  copy  print ? <bean id="orgService" class="com.ljh.web.Service.OrgService"></bean>  

             默认情况下使用注解声明的Bean对象id名称为:类名称的首字母小写,一般不需要我们进行设置,如果想要设置时,例如我们指定的是实现类,而名字指向了接口,直接添加value属性即可:@Service(value="name"),当然value是可以省略的。

     

               Spring框架还为我们提供了代替上边三个分层注解的通用注解:@Component.当然提倡大家使用分层注解更好一些,区分层次比较明确。

     

              2,自动装配功能的实现对象之间的组合关系,在属性前边指定下边的注解:

                  @Autowired : 采用类型的方式完成自动装配 : byType

                  @Resource : 采用名称+类型的方式完成自动装配 : byName +byType,此种方法推荐使用。

                 另外Spring提供的两种注解的自动装配功能,属性不需要声明set,get方法也可以完成组合功能,这是非常方便的。

     

              3,在声明action时,需要指定其为多例的,解决线程安全的问题,在配置文件中我们通常会这样声明action的类:

    [html]  view plain  copy  print ? <bean id="orgAction" class="com.ljh.web.action.OrgAction" scope="prototype"></bean>  

              而在Spring注解开发中也提供了类似的属性来解决此问题,在action类前边设定如下:

     @Scope("prototype")

     

             4,利用配置文件声明Dao层类时,通常是这样的:

    [html]  view plain  copy  print ? <!-- dao层需要引用我们的sessionFactory工厂,自动装配时,           是会自动装配名叫sessionFactory的工厂,所以可以省略。        -->       <bean name ="orgTypeDao" class="com.ljh.dao.impl.OrgTypeDaoImpl">           <!--<property name="sessionFactory" ref="sessionFactory"></property>-->       </bean>  

               而,注解开发的方法如何进行sessionFactory的注入呢?由于Dao层继承了父类HibernateDaoSupport,而在父类中有这样一个方法:

    [java]  view plain  copy  print ?       //父类中的sessionFactory的set注入方法   ublic final void setSessionFactory(SessionFactory sessionFactory) {   if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {       this.hibernateTemplate = createHibernateTemplate(sessionFactory);   }  

              这是sessionFactoryset注入方法,所以如果我们能够重写此方法,在此方法上进行@Resource注解,即可解决我们的问题,但是可以看到此方法是用final进行修饰的,所以通常情况下,我们采用下边的这种方法进行解决:

    [java]  view plain  copy  print ? @Repository("orgDao")   public class OrgDaoImpl extends HibernateDaoSupport implements OrgDao {          @Resource       //自定义了方法,解决了父类中final修饰不能重写的问题       public void setSuperSessionFactory(SessionFactory sessionFactory) {                //调用了父类的setSessionFactory方法           super.setSessionFactory(sessionFactory);       }   }  

               这样,Dao层的sessionFactory就进行了注入,我们可以正常编写我们的Dao层代码了。当然了对于Dao层如果我们使用了Ibatis,同样可以使用这种方法进行Ibatis核心对象sqlMapClient的注入。

     

              综上,为Spring框架的注解开发常用注解,总体感觉还是比较简单,最起码相对其它两个框架而言,主要是通过注解完成对象的管理,和对象之间的组合,即SpringIoC功能。注解的开发还是能大大提高我们的开发效率的,但是还是那句话,它在一定程度上违背了OCP原则,所以大力推荐使用注解的开发的前提还是我们的需求比较固定,变动较小。

    转载请注明原文地址: https://ju.6miu.com/read-10606.html

    最新回复(0)