`
woaiyingyu123
  • 浏览: 71668 次
  • 性别: 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配置文件实现AOP

    三、配置文件实现AOP 1. 配置Advisor:Advisor是通知和切点的组合。在Spring的XML配置文件中,我们可以创建一个`&lt;aop:config&gt;`元素,并在其内部定义`&lt;aop:advisor&gt;`来创建Advisor。Advisor的`advice-ref`属性用于...

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    Spring的基本配置

    本篇文章将详细探讨Spring的基本配置,帮助你深入理解如何在项目中设置和使用Spring。 一、Spring配置概述 Spring的配置方式主要有两种:XML配置和Java配置。早期,XML配置是主流,而现在,随着Spring Boot的兴起...

    springsecurity使用配置详解

    在本文中,我们将深入探讨Spring Security的配置及其在实际应用中的使用。 首先,Spring Security的核心概念包括用户、角色、权限和访问控制。它提供了一种机制来验证用户身份(身份验证),并决定用户是否可以访问...

    Spring动态加载配置文件

    当`ApplicationContext`被刷新后,可以调用`ServletContext`的相关方法来更新上下文中的信息,确保整个应用都能使用最新的配置。 总的来说,Spring动态加载配置文件的实现涉及到文件监听、配置文件解析、应用上下文...

    Spring依赖包和配置文件

    2. **自动配置**:Spring Boot引入了自动配置的概念,根据类路径中的jar文件自动配置Spring应用,减少了大量手动配置工作。 3. **注解驱动**:Spring 3.0以后,注解成为主流,如@Service、@Repository、@Controller...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...

    Spring Cloud alibaba项目搭建及配置详细步骤

    以上就是Spring Cloud Alibaba项目搭建及配置的基本步骤,主要涉及到了Spring Cloud的配置中心Nacos和Dubbo服务治理。实际开发中,还需要考虑异常处理、熔断机制、负载均衡等高级特性,这些可以通过Spring Cloud ...

    Spring+Spring MVC+MyBatis之零配置之路源代码

    这个"Spring+Spring MVC+MyBatis之零配置之路源代码"项目旨在展示如何在不使用XML配置的情况下,通过Java配置和注解驱动的方式来搭建一个完整的SSM(Spring、Spring MVC、MyBatis)应用。 Spring框架作为基础,提供...

    SSH三大框架整合 struts2(使用xml配置)+hibernate(使用xml配置)+spring(使用xml配置)

    本项目整合了这三个框架,并使用XML配置来管理各个组件,实现了基本的CRUD(创建、读取、更新、删除)功能以及分页查询。 首先,Struts2作为表现层框架,负责处理HTTP请求,控制应用程序的流程。通过定义Action类和...

    spring security 使用及配置

    Spring Security 使用及配置 Spring Security 是一个基于 Java 的安全框架,提供了丰富的安全功能,包括身份验证、授权、加密、会话管理等。下面将对 Spring Security 的使用及配置进行详细介绍。 身份验证 身份...

    springcloud配置中心个人demo

    本项目是一个个人实现的 SpringCloud Config 的演示示例,旨在帮助理解其工作原理和使用方法。以下是对相关知识点的详细说明: 1. **SpringCloud Config Server**:Config Server 是 SpringCloud Config 的核心组件...

    Spring—下载与配置

    每个模块都有相应的配置和使用方法,可以根据项目需求进行选择和配置。 总的来说,Spring框架是一个强大而灵活的平台,它的下载与配置是开发者入门的关键步骤。理解并熟练掌握Spring的基本配置,可以为后续的开发...

    Spring boot工具类静态属性注入及多环境配置详解

    Spring Boot工具类静态属性注入及多环境配置详解 Spring Boot工具类静态属性注入是指使用Spring Boot框架时,如何将配置信息注入到工具类的静态变量中,以便在程序中使用这些配置信息。这种方式可以方便地在不同的...

    spring famework 配置启动方式

    本篇文章将深入探讨Spring Framework的两种主要配置启动方式:XML配置和注解配置,并通过具体的示例来阐述这两种方法。 首先,让我们从XML配置开始。在Spring早期版本中,XML配置是最常见的方式,它通过定义Bean的...

    SSH---Spring减少配置量将公共的配置进行抽象源码

    例如,我们可以使用@Component在类级别上标记,然后使用@Configuration和@ComponentScan在主配置类中指定包路径,让Spring自动搜索并管理这些类。 其次,Spring的自动配置(Auto Configuration)是另一个减轻配置负担...

    SpringMVC+Spring+MyBatis jar包和配置文件

    SpringMVC、Spring和MyBatis是Java Web开发中广泛使用的三大框架,它们共同构建了一个高效、灵活的后端架构。下面将详细讲解这三个框架的核心概念、整合过程以及相关配置文件的作用。 首先,Spring框架是Java企业级...

    Spring 最全约束配置文件

    综上所述,Spring框架的配置文件是其核心组成部分之一,通过合理的配置,可以有效地管理应用程序中的Bean及其实现的各种功能。掌握Spring配置文件的编写方法对于开发基于Spring的应用程序至关重要。

    spring 与 spring mvc 整合 配置讨论

    本文将深入探讨Spring与Spring MVC的整合配置,并结合标签"源码"和"工具"来解析相关的技术细节。 首先,Spring框架的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented ...

    Spring中使用classpath加载配置文件浅析

    本文将详细分析Spring通过classpath加载配置文件的不同情形,并提供解决加载过程中可能遇到的问题的方法。 首先,我们来看一下Spring加载配置文件的基本方式。在Spring中,可以通过ApplicationContext接口的实现类...

Global site tag (gtag.js) - Google Analytics