`
woaiyingyu123
  • 浏览: 69709 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

(三)配置及用法之Spring

阅读更多
Spring 也表示是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的。框架的主要优势之一就是其分层架构。本文是Spring的配置,主要讲解的还是xml和Annotation的配置。里面涵盖了一点整合的配置,具体三大框架的整合,之后还会发表文章。之前发表的文章还很不完善,希望在以后慢慢的补充和完善下去,有不懂的或我写得不对的请留言,我们大家一起讨论一下。进入正题。
(1)Spring目前用到的包:
cglib-nodep-2.1_3.jar、commons-logging.jar、dom4j-1.6.1.jar、log4j-1.2.15.jar、spring.jar、aspectjrt.jar、aspectjweaver.jar、struts2-spring-plugin-2.2.1.1.jar、commons-dbcp.jar、commons-pool.jar

(2)applicationContext.xml的配置(一般放在WebRoot/WEB-INF文件里):
<?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"
       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-2.5.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/aop          
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
       http://www.springframework.org/schema/tx   
       http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--在自定义的包路径里寻找匹配的Bean-->
<context:component-scan base-package="com.xxx"></context:component-scan>
<!--Bean的定义-->
<bean id="xxx" class="xxx" scope="">
//这里的scope属性很重要,在下面介绍
   <property name="bean里的属性名">
        <ref bean="引用的bean" />//通过已声明的Bean进行注入
      //<bean id="" class=""></bean>把要注入的Bean在里面定义
      //<constructor-arg><value>ABC</value></constructor-arg>构造注入
      //<value>xxxx</value>设值注入
   </property>
</bean>
<!-- 定义事务管理器 -->
//定义Hibernate事务管理
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory">
		<ref bean="sessionFactory" />
	</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>//定义注解配置事务,如果要使用注解事务,必须定义这个
<!--配置AOP-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>	//使用AOP自动代理,必须定义
<aop:config>
   <aop:aspect id="logsAspect" ref="logsRecord">
       <aop:pointcut expression="execution(* com.xxx.service.impl.AdminLogin.login(..))" id="recordPoint" />
	   <aop:after-returning method="recordLogs"
				returning="flag" pointcut-ref="recordPoint" />
    </aop:aspect>
</aop:config>
//bean的scope属性:(1)singleton作用域:当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的恳求 ,只要id与该bean定义相匹配,则只会返回bean的同一实例。(2)prototype:prototype作用域布置的bean,每一次恳求 (将其注入到另一个bean中,或者以程序的法子 调用容器的getBean()法子)都会产生 一个新的bean实例,相当与一个new的操作。(3)request:request表现 该针对每一次HTTP恳求 都会产生 一个新的bean,同时该bean仅在当前HTTP request内有效
(4)还有session、global session等![color=red]详细使用请上网查找,一般的选择原则:有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。我曾经因为Action调用错误,让Spring管理Action,因为是单例模式,导致以后都出错。改为prototype之后就解决了。所以得慎用![/color]


web.xml的配置:
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
     //如果applicationContext.xml在src下classpath:applicationContext.xml
    //如果有多个的xml,如applicationContext.xml、applicationContext-xxxx.xml在src下classpath:applicationContext*.xml,*表示:如abc*.xml匹配abc.xml、abc-xxx.xml等,同理可得。。。你懂的

接下来详解applicationContext.xml的几个主要的配置,主要使用例子来讲述,里面涵盖xml和Annotation的联合使用:

自定义的注解:
@Target(ElementType.METHOD)//定义这个注解只能用在方法之上
@Retention(RetentionPolicy.RUNTIME)//运行时
public @interface MethodAnnotation {
	String value() default "";
}


AdminLogin类:
@Service//设置为Spring的组件
@Scope(value="xxx")设置作用域
public class AdminLogin implements LoginService {
 @Resource//Bean属性的匹配
 private HibernateUtilDao hibernateUtilDao;
 @MethodAnnotation("注解测试")
  public boolean login(String name, String passWord) {
    boolean flag = false;
    String hql = "from Admin as admin where admin.adminName=? and admin.passWord=?";
    String[] params = { name, passWord };
    Iterator<Object> iter = hibernateUtilDao.queryList(hql, params).iterator();
	if (iter.hasNext()) {
		flag = true;
		ActionContext.getContext().getSession().put("userName", name);
		}
	return flag;
	}
}
//@Resource(name="xxx")有二义性的话需设置名字匹配或type="xxx"(类型匹配),如果无二义性(所谓二义性,比如不同的bean可以实现于同一个接口)的话不需要设定,个人认为不管有没有二义性,设定name匹配比较好些。
//@Resource(name="xxx")等价于@Autowired加上@Qualifier("xxx"),好像@Autowired默认是类型匹配。还是用@Resource(name="xxx")比较好。不容易混乱


AOP的配置:
LogsRecord类,我暂且把这个类理解为“切面”
@Component//声明为Spring的组件Bean,还有@Service(业务组件)@Repository(持久化组件)@Controller(控制组件),他们的效果都是一样的,名字只是为了更好的区分他们的分层作用,如果不设定name,bean的name默认为以类名为标准,开头小写,如logsRecord
public class LogsRecord {
  public void recordLogs(JoinPoint jp, boolean flag) {//JoinPoint为切入点的意思,具体用法看方法内部。flag是我们之前定义通知时设置的返回值,名字随意起,但是上下要一致。这个返回值从哪里来?就是切点方法(login)调用之后得到的返回值(login返回的是boolean)。
		if (flag) {
			Method[] method = jp.getTarget().getClass().getMethods();
                       //获得切点jp这个类里的所有方法(Admin类里的方法)
			MethodAnnotation methodAnnotation = method[0]
					.getAnnotation(MethodAnnotation.class);//获得method[0]方法上的注解                   
			System.out.println(method[0].getName());
			System.out.println("注解作用:" + methodAnnotation.value());
			String userName = (String) ActionContext.getContext().getSession()
					.get("userName");
			System.out.println(userName + "在" + new Date().toString() + "进行了"
					+ jp.getSignature().getName() + "操作");//jp.getSignature.getName()获得当前切点执行的方法的方法名
		}
	}
}

<aop:config>
   <aop:aspect id="logsAspect" ref="logsRecord">//ref引用Bean,可以理解为切面,切面=切点+通知
       <aop:pointcut expression="execution(* com.lrl.service.impl.AdminLogin.login(..))" id="recordPoint" />//定义切点,execute(返回值 包名.类名.方法(参数列表)),*表示匹配所有,参数里的(..)表示匹配所有参数
	   <aop:after-returning method="recordLogs"
				returning="flag" pointcut-ref="recordPoint" />//定义通知,method为切面里的方法,returning为返回值标识(可无), pointcut-ref引用定义的切点。
    </aop:aspect>
</aop:config>

用Annotation配置AOP:当然,如果不喜欢在xml中配置AOP,我们同样可以使用注解配置,代码等效如下:
@Component
@Aspect//定义为切面,必须写
public class LogsRecord {
	@AfterReturning(pointcut="execution(* com.lrl.service.impl.AdminLogin.login(..))",returning="flag")//设置通知,原理和xml配置AOP一样
	public void recordLogs(JoinPoint jp, boolean flag) {
		System.out.println(123);
		if (flag) {
			Method[] method = jp.getTarget().getClass().getMethods();
			MethodAnnotation methodAnnotation = method[0]
					.getAnnotation(MethodAnnotation.class);
			System.out.println(method[0].getName());
			System.out.println("注解作用:" + methodAnnotation.value());
			String userName = (String) ActionContext.getContext().getSession()
					.get("userName");
			System.out.println(userName + "在" + new Date().toString() + "进行了"
					+ jp.getSignature().getName() + "操作");
		}
	}
}
//其实AOP还有很多很深的用法,这里就不一一列举。前置通知,环绕通知等用法都差不多,只是环绕通知需要一个方法环绕点。
请上网查看有关资料和文档。
Spring事务的配置:(Spring事务分为编程式事务和声明式事务),以下资料参考网上和老师的~自己全写完很累,哈哈。声明式事务使用比较方便。。
(1)每个Bean都有一个代理类
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="dataSource">
		<ref bean="mySqlDateSource" />
		</property>
		<property name="hibernateProperties">
   <props>
	<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
	<prop key="hibernate.hbm2ddl.auto">update</prop>
	<prop key="hibernate.show_sql">true</prop>
   </props>
	</property>
	<property name="mappingResources">
	   <list>
		<value>com/lrl/entity/User.hbm.xml</value>
	  </list>
	</property>
  </bean>//之后的sessionFactory都一样,就不都写上去了。篇幅问题。。
    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="userDao"       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
       <!-- 配置事务管理器 -->  
           <property name="transactionManager" ref="transactionManager" />     
        <property name="target" ref="userDaoTarget" />  
         <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>  
        </property>  
    </bean>  
</beans>

(2)所有Bean共享一个代理类
    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> 
    <bean id="transactionBase"          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
            lazy-init="true" abstract="true">  
        <!-- 配置事务管理器 -->  
        <property name="transactionManager" ref="transactionManager" />  
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props>  
        </property>  
    </bean>     
    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="userDao" parent="transactionBase" >  
        <property name="target" ref="userDaoTarget" />   
    </bean>
</beans>

(3)使用拦截器
    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>  
    <bean id="transactionInterceptor"  
       class="org.springframework.transaction.interceptor.TransactionInterceptor">  
        <property name="transactionManager" ref="transactionManager" />  
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props>  
        </property>  
    </bean>      
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        <property name="beanNames">  
            <list>  
                <value>*Dao</value>
            </list>  
        </property>  
        <property name="interceptorNames">  
            <list>  
                <value>transactionInterceptor</value>  
            </list>  
        </property>  
    </bean>   
    <!-- 配置DAO -->
    <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

(4)面向切面的方式
 <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
  </bean>
   <aop:config>
	<aop:pointcut id="serviceMethods" expression="execution(*
		com.zoo.dao.base.*.*(..))" />
	<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
	</aop:config>
	<tx:advice id="txAdvice" transaction-manager="txManager">
	    <tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="edit*" propagation="REQUIRED" />
			<tx:method name="alter*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="merge*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="remove*" propagation="REQUIRED" />
			<tx:method name="do*" propagation="REQUIRED" />
			<tx:method name="attach*" propagation="REQUIRED" />
			<tx:method name="*" read-only="true" />
		</tx:attributes>
	</tx:advice>
//面向于切面,比较好把~~~

(5)注解式事务
<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory">
		<ref bean="sessionFactory" />
	</property>
</bean>
<!-- 注解事务驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" />
//注意:用注解式事务,需要在要使用的方法或类之上加上@Transactional注解,方可生效!
//使用mercy时,配置上事务,否则更新不生效。(在Service比较好)

基本的配置就这样了。如果有什么不正确的或者不完善的,请留言,谢谢。
总结:(1)主要开发过程:applicationContext.xml+web.xml
      (2)如果用Annotation设置Spring组件(@Compont等),且设置属性匹配(@Resource等),那么applicationContext.xml就会省了很多代码。
      (3)事务、AOP的过程见文章内部。
分享到:
评论

相关推荐

    Spring cloud和Spring boot介绍

    Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置。Spring Boot的设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

    spring五种事务配置demo

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

    Spring事务配置的五种方法

    Spring事务配置的五种方法 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、...

    Spring Security 配置

    介绍了Spring Security 的配置方法及其使用技巧

    java学习之SpringSecurity配置了登录链接无权限

    我们在使用SpringSecurity作为后台权限框架的时候,框架给我们提供了配置登录请求的接口,供我们配置登录链接,当我们配置了登录链接地址后,前端访问登陆请求的时候显示无权限。 异常分析 由于SpringSecurity的...

    Spring攻略PDF版

    Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法  ...

    Spring的学习笔记

    一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope...

    使用注解配置实现Spring动态数据源切换

    使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...

    spring mvc配置datasource数据源的三种方式

    spring mvc配置datasource数据源的三种方式,对spring的数据库连接源配置,有很大帮助,使你更加准确地了解数据源、连接池的实际使用方法

    Spring攻略中文版PDF

    Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法  ...

    Spring事务优缺点及使用详解.docx

    事务简介 二、程序举例环境搭建 o1. 创建数据表 ...三、使用 Spring 的事务注解管理事务 o1. 声明事务管理器 o2. 开启注解驱动 o3. 完整Spring配置文件 o4. 业务层 public 方法加入事务属性 o5. 测试

    基于springboot+springcloud实现的电商网站项目源代码+数据库,spring cloud进行微服务框架开发

    数据库使用本机localhost配置MySQL b2bdata.sql 和 b2bgoods.sql。 common 模块中 install 启动 eureka-server 启动 user-provider,注意修改数据库连接密码 启动 user-consumer 访问 ...

    Spring攻略英文版(附带源码)

    Spring专家力作 理论与实践完美结合 问题描述→解决方案→实现方法 第一部分 核心概念  第1章 控制反转和容器   1.1 使用容器管理组件   1.1.1 问题描述   1.1.2 解决方案   1.1.3 实现方法   1.2...

    尚硅谷佟刚Spring4代码及PPT.rar

    代码及ppt涵盖 Spring4.0 的所有核心内容:在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的...

    spring-cloud-config使用oracle存储配置

    spring-cloud-config使用oracle存储配置:提供了客户端与服务端配置文件与pom依赖。具体配置方法可以看一下我发的博客

    spring-boot中文教程

    Spring Boot中文文档提供了详细的中文翻译和说明,包括了基本概念、使用方法、配置参数、代码示例等,可以帮助用户快速上手和深入理解Spring Boot的使用。该文档还提供了丰富的链接和参考资料,方便用户深入学习和...

    spring.net中文手册在线版

    使用方法的返回值进行注入 4.3.6.IFactoryObject接口的其它实现 4.3.6.1.Log4Net 4.3.7.使用depends-on 4.3.8.自动装配协作对象 4.3.9.检查依赖项 4.4.类型转换 4.4.1.枚举类型的转换 4.4.2.内置的类型转换器 4.4.3....

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。... 可以解决办法是:当方法不需要事务支持的时候,使用 Session session = sessionFactory.openSession()来获得Session对象,问题解决!

    spring使用实例demo

    这个demo实现了spring框架开发的使用实例配置文件配置方法

    spring杂谈 作者zhang KaiTao

    1.6 »Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) 1.7 Spring开闭原则的表现-BeanPostProcessor扩展点-2 1.8 Spring3.1 对Bean Validation规范的新支持(方法级别验证) 1.9 Spring对事务...

Global site tag (gtag.js) - Google Analytics