• 框架整合小小总结【SSH】注解式


    Spring 注解式注册 bean:

    大致分为以下几步:

    1. 开启 context 空间支持
    2. 开启自动扫描功能,指定扫描包路径
    3. 使用注解配置 bean (使用@Component 注解)
    4. 给 bean 注入属性(基本类型和引用类型)
    5. 设置 bean 的生命周期
    6. 设置 bean 的作用域(默认为单例)


    详细:

    1 . 开启 context 空间支持

    2 . 开启自动扫描功能,指定扫描路径(说明:扫描路径可以设置多个,中间使用,隔开,扫描路径包含指定包和子包内所有的类)

    <beans xmlns="http://www.springframework.org/schema/beans"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:context="http://www.springframework.org/schema/context" 
                   xsi:schemaLocation="
                http://www.springframework.org/schema/beans 
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context                                     
                http://www.springframework.org/schema/context/spring-context.xsd
                ">
    <!-- 这里指定的是带有注解配置的bean,基本所有的类都要配置,dao,service -->
    <context:component-scan base-package="com.msym.dao,com.msym.service"></context:component-scan>
    </beans>

    对于不同的层有三种不同的 bean 注解:

    • @Repository 用于数据层实现类标注
    • @Service用于业务层的实现类的注解
    • @Controller用于控制层实现类的注解

    4.1 为 bean 注入简单类型:

    1. 在属性名上方声明该属性自动装配 @Autowired
    2. 在属性名上方声明该属性注入的值 @Value(value)

    【注意:注解自动装配属性值无需提供对应属性的setter方法】

    例如:

    @Autowired
    @Value("msym")
    private String msg;

    这样设置之后就无需再提供该属性的 get/set 方法了,

    4.2 为 bean 注入引用数据类型:

    1. 在属性名上方声明该属性自动装配 @Aotuwired
    2. 在属性名上方声明该属性注入的值 @Qualifier(bean 引用的名字)

    【注意:注解自动装配属性值无需提供对应属性的setter方法】

    例如:

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    5 . 设置 bean 的生命周期(即配置创建 bean 时要执行的方法,和 bean 销毁时需要执行的方法)

    @PostConstruct

    功能:为当前 Bean 指定 init-method 参数

    格式:定义在成员方法的上方,兼容静态方法

    @PreDestroy

    功能:为当前 Bean 指定 destory-method 参数

    格式:定义在成员方法的上方,兼容静态方法

    注意:要求当前类被注册为 Bean,否则无效果

    6 . 设置 bean 的作用域(设置 scope 属性)

    在类的定义上方添加 @Scope 指定 Bean 的作用域(特别要注意给 action 注解时要指定为 prototype)

    常用:@Scope("prototype")

    默认:@Scope("singleton")

    Spring 注解式整合 JUnit:

    大致步骤:

    1. 导包
    2. 设置类运行器【注解添加到运行程序类的上方 @RunWith(SpringJUnit4Class.class)】
    3. 设置读取 Spring 的配置文件的路径【也在运行程序类上方 @ContextConfiguration(location={“classpath:/applicationContext.xml”})  】

    例子:

    @RunWith(SpringJUnit4ClassRunner.class)        //设置JUnit运行器为Spring
    @ContextConfiguration(locations={"classpath:/applicationContext.xml"})    //加载配置
    public class App {
            //要测试的Bean必须称为测试类的属性注入进来,然后对其进行测试
             @Autowired
            @Qualifier("testBean")
            private Bean1 testBean;
            
            @Test
            public void testJunit(){
                testBean.fn();
            }
    }

    注意:使用 junit 整合 spring 时,必须保障运行类中要注入要测试的 Bean。整合完毕后,当前的测试类将作为 Spring 的 Bean 出现,而测试的 Bean 对象作为测试类的注入资源进行运行。(也就是被测试的对象要注入进来)

    Spring 注解式实现 AOP:

    大致步骤:

    1. 在核心配置文件中开启 aop 命名空间
    2. 在核心配置文件中配置支持@aspectj
    3. 将所有参与 AOP 的类配置为 bean
    4. 在切面类上添加切面声明注解@Aspect
    5. 将切面类中的方法配置为指定类型的通知(之前,之后,环绕,异常和返回通知5种),并配置该通知方法的切入点表达式

    详细:

    1 . 在核心配置文件中开启 aop 命名空间

    2 . 开启支持 @aspectj 注解,

    3 . 将所有参加 AOP 的类配置为 bean

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.xsd
            ">
        <!-- 首先上面需要引入 aop 的命名空间,然后开启注解式AOP功能 -->    
        <aop:aspectj-autoproxy/>
        <!-- 将需要参加 AOP 的类配置为 bean -->
        <!-- 这里指定的是带有注解配置的bean,基本所有的类都要配置,dao,service --> 
        <context:component-scan base-package="com.msym.dao,com.msym.service"></context:component-scan>
    </beans>

    3 . 在切面类中添加@Aspect注解

    @Aspect
    public class MyAdvice {…}

    4 . 将切面类中的方法配置为通知,使用五个注解之一,并指定切入点表达式

    @Aspect
    public class MyAdvice {
        @Before("execution(* con.msym.service.UserImpl.add())")
        public void before(JoinPoint jp) {
            System.out.println("before");
        }
        . . . 
    }

    Spring 提供的注解式事务【结合 AOP】:

    大致步骤:

    1. 在配置文件中开启 aop 和 tx 命名空间
    2. 定义事务管理器,并注入数据源 datasource (要保证这个数据源和 dao 层的数据源一致,主要是需要数据库连接的信息)
    3. 在配置文件中开启注解式事务驱动管理,并为其指定事务管理器
    4. 对要添加事务的接口方法上添加声明 @Transactional ,也就是切入点。【推荐在接口上声明事务,这样改接口的所有实现类中的方法都将携带事务 】

    对于第二点,常见的事务管理器有五种:

    • DataSourceTransactionManager【使用Spring JDBC 或者 Mybatis 进行持久化时使用这个 】
    • HibernateTransactionManager【使用 Hibernate3.0 持久化时使用这个 】
    • JpaTransactionManager【使用 JPA 进行持久化时使用这个 】
    • JdoTransactionManager【使用 Jdo 进行持久换时使用 】
    • JtaTransactionManager【使用 JTA 实现事务管理时,在一个事务跨多个资源时必须使用 】

    详细:

    1 . 开启 aop 和 tx 命名空间

    2 . 定义事务管理器,注入数据源

    3 . 开启注解事务驱动,指定事务管理器

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx.xsd
            ">
            <!-- 开启注解式事务驱动 -->
            <tx:annotation-driven transaction-manager="txManager"/>
    
            <!-- 指定事务管理器,并注入数据源 -->
            <bean id=" txManager " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                 <property name="dataSource" ref="dataSource"></property>
            </bean>
    
            <!-- DataSource -->
            <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
                 <property name="username" value="root"/>
                 <property name="password" value="root"/>
           </bean>
    </beans>

    4 . 在需要事务的地方添加 @Transactional【一般在接口上】(我在这里是写在了方法上)

    @Transactional
    public void transfer(String out, String in , Double money){
        accountDao.outMoney(out, money);
        accountDao.inMoney(in, money);
    }

    在上面的 @Transactional 注解中可以添加事务相关的属性。详见【http://www.cnblogs.com/daimajun/p/7136422.html】。

    Spring 为 Hibernate 准备了两个模板类:

    【jdbcTemplate 和 HibernateTemplate】

    jdbc.properties文件:【用于存储数据库连接信息】

    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/springdb
    jdbc_username=root
    password=root
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            ">
        <!-- 导入jdbc.properties文件 -->
        <context:property-placeholder location="classpath:jdbc.properties"/>
    
        <!-- 将自己的Dao层类配置为 bean ,并注入jdbcTemplate, -->
        <bean id="userDao" class="com.msym.spring.jdbc.UserDao">
            <property name="jdbcTemplate" ref="jdbcTemplate"/>
        </bean>
        
        <!-- jdbcTemplate 模板类,为其注入数据源-->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource3"/>
        </bean>
    <!-- 以下是三种数据源的配置 -->
        <!-- dataSource -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${driverClass}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </bean>
        
        <!-- dbcp -->
        <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${driverClass}"/> 
            <property name="url" value="${url}"/> 
            <property name="username" value="${username}"/> 
            <property name="password" value="${password}"/>
        </bean>
        
        <!-- c3p0 -->
        <bean id="dataSource3" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClassName" value="${driverClass}"/> 
            <property name="url" value="${url}"/> 
            <property name="username" value="${username}"/> 
            <property name="password" value="${password}"/>    
        </bean>
    </beans>

    虽然有两个模板类,但我还是使用自己实现的 DAO,注入 SessionFactory 的方式,这篇博客我的Hibernate实现的DAO层】,然后将 Dao层的对象配置成 bean即可。

     

    SSH整合详细:

    1 . Jar包整合:

    Struts2:必备包+整合包【也称为插件包】

    基本包:(11个),可以去这里找 : appsstruts2-blankWEB-INFlib*.jar

    插件包:(3个),

    • struts2-spring-plugin-x.x.x.jar【struts整合spring需要】
    • struts2-Ajax-plugin-x.x.x/jar【struts2整合AJAX需要】
    • struts2-convention-plugin-x.x.x.jar【注解开发需要】

    配置文件:struts.xml ,web.xml

    Spring3:

    核心包:(4个)【没写版本和后缀】

    • spring-beans
    • spring-core
    • spring-context
    • spring-expression

    日志包:(2个)

    • com.springsource.org.apache.commons.loging
    • com.springsource.org.apache.log4j

    AOP包:(4个)

    • spring-aop
    • spring-aspects
    • com.springsource.org.aopalliance
    • com.spring.org.aspectj.weaver

    JDBC包:(2个)

    • spring-jdbc
    • spring-tx

    整合ORM框架需要的包:(1个)

    • spring-orm

    WEB集成:(1个)

    • spring-web

    配置文件:

    • applicationContext.xml
    • web.xml 文件中添加spring 的 IoC 容器加载监听器
    • log4j.properties文件

    Hibernate:

    核心jar包:(1个)

    • Hibernate3.jar

    必须的 jar 包:(6个)

    • lib equired目录下所有的 jar 包
    • antlr-x.x.x.jar
    • commons-collections-x.x.x.jar
    • dom4j-x.x.x.jar
    • javassist-x.x.x.jar
    • jta-x.x.x.jar
    • slf4j-api-x.x.x.jar

    jpa 的 jar 包:(1个)

    • hibernate-jpa-2.0-api-1.0.1.Final.jar

    slf4j 整合log4j 的 jar 包(1个)【log4j已在spring中导入】

    • slf4j-log4j-1.7.2.jar

    配置文件:

    • hibernate.cgf.xml
    • Model.hbm.xml

    2 . 框架间细节的整合

         web.xml 文件中添加三个配置:

    • Struts2 核心过滤器【StrutsPrepareAndExecuteFilter】
    • Spring 容器监听器【ContextLoaderListener】
    • Hibernate 的延迟加载问题【OpenSessionInViewFilter】
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
         <!-- 
            applicationContext对象加载仅加载一次,服务器启动时加载,
            使用 web中的监听器机制,必须配置在最上面,因为不管什么对象都需要Spring来管理
          -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
       <!-- 将事务开启到业务层,需要配置 OpenSessionInViewFilter过滤器,而且必须在 Struts核心过滤器之上 -->
        <filter>
             <filter-name>openSessionInView</filter-name>
             <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        </filter>
        <filter-mapping>
             <filter-name>openSessionInView</filter-name>
             <url-pattern>/*</url-pattern>
        </filter-mapping>     
    
         <!-- struts核心过滤器 -->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>            
    </web-app>

     

    Struts.xml 文件:

    整合spring 和 Struts2 时,直接将 struts2 的action配置为 bean,并且将其 scope 属性设置为 prototype

    整合 Hibernate 一般推荐将 hibernate.cfg.xml 文件的配置信息搬到 applicationContext.xml 里面

    <!-- 导入jdbc.properties文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- SessionFactory-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 注入数据源-->
        <property name="dataSource" ref="dataDource"></property>
        <!-- 可选配置,hibernate前缀不能丢-->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format">true</prop>
            </props>
        </property>
        
        <!-- 资源注册 -->
        <property name="mappingResource">
            <list>
                <value>com/msym/user/UserModel.hbm.xml</value>
                <!-- 推荐使用通配符的形式进行资源注册 -->
                <!--
                    <value>com/msym/*/*.hbm.xml</value>
                -->
            </list>
        </property>
    </bean>
    
    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="diverClass">${diverClass}</property>
        <property name="url">${url}</property>
        <property name="username">${username}</property>
        <property name="password">${password}</property>
    </bean>
  • 相关阅读:
    CF819B Mister B and PR Shifts
    HDU5969 最大的位或
    UVA1464 Traffic Real Time Query System
    [SCOI2010]连续攻击游戏
    [USACO11JAN] Roads and Planes
    [POJ3613] Cow Relays(Floyd+矩阵快速幂)
    洛谷P3237 [HNOI2014]米特运输(树形dp)
    awk 正则表达式、正则运算符详细介绍
    awk单行脚本快速参考
    Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
  • 原文地址:https://www.cnblogs.com/daimajun/p/7126389.html
Copyright © 2020-2023  润新知