Spring的使用

Spring的组成
1、    Core模块
该模块是Spring的核心容器,它实现了Ioc模式和Spring框架的基础功能。
2、    Context模块
该模块继承BeanFactory类,并添加了事件处理、国际化、资源加载、透明加载已经数据检验等功能。
3、    Aop模块
  Spring集成了所以Aop功能,通过事务管理可以任意Spring管理的对象Aop化。
4、    Dao模块
该模块提供了JDbc的抽象层,简化了数据库厂商的异常处理。
5、    Orm映射模块
该模块提供了对现有ORM框架支持,为Hibernate提供了完美的结合。
6、    web模块
该模块建立在SpringContext基础之上,提供了Servlet监视器的Context和web应用的上下文,为现有Web框架提供了集成。
7、    MVC模块
实现了控制逻辑和业务逻辑的清晰分离。

Spring的包
包名    说明
Org.springframework.aop-3.1.1.release.jar    Spring的Aop模块
Org.springframework.asm-3.1.1.release.jar    Spring独立的asm程序,需要asm.jar包
Org.springframework.aspects-3.1.1.release.jar    Spring提供对Aspectj框架的整合
Org.springframework.beans-3.1.1.release.jar    Ioc的实现
Org.springframework.context.support-3.1.1.release.jar    MVC扩展支持
Org.springframework.context-3.1.1.release.jar    Spring的上下文,spring提供在基础ioc功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务器、任务调度、JNDI定位、Ejb集成等。
Org.springframework.core-3.1.1-release.jar    Spring的核心模块
Org.springframework.expreesion-3.1.1.release.jar    Spring的表达式语言
Org.springframework.instrument.tomcat-3.1.1.release.jar    tomcat连接池的支持
Org.springframework.instrument-3.1.1.release.jar    对服务器的代理接口
Org.springframework.jdbc-3.1.1.release.jar    jdbc模块
Org.springframework.jms-3.1.1.release.jar    JMS  API使用的简单封装
Org.springframework.orm-3.1.1-release.jar    Orm模块,支持Hibernate和JDO等orm工具
Org.springframework.oxm.3.1.1-release.jar    对Object/XML的映射支持
Org.springframework.test-3.1.1.release.jar    对Junit等测试框架的简单封装
Org.springframework.transaction-3.1.1.release.jar    jdbc、Hibernate、jdo、jpa等提供一致的声明式和编程式事务关联
Org.springframework.web.portlet-3.1.1.release.jar    Mvc的增强
Org.springframework.web.servlet-3.1.1.release.jar    对java EE6.0和Servlet3.0的支持
Org.springframework.web.struts-3.1.1.release.jar    整合struts
Org.springframework.web-3.1.1.release.jar    web模块,包含web application context
需要其他包的支持commons-logging.jar和aopalliance.jar的支持。
BeanFactory关联bean
BeanFactory采用了java的工厂模式,通过配置xml文件或属性文件.properties中读取javabean的定义来创建、配置和关联javaBean。BeanFactory有很多实现类,其中,xmlBeanFactory类通过xml文件格式读取配置信息加载javaBean。
//获取配置文件
Resource resource = new ClassPathResource("applicationContext.xml");            //装载配置文件
            BeanFactory factory = new XmlBeanFactory(resource);
            User user = (User) factory.getBean("user");
bean的生命周期
    实例化javabean、初始化javaBean、使用javabean和销毁javaBean共4个阶段。

applicationContext接口的创建。
applicationContext接口有3个实现类:ClassPathXmlApplicationContext类、FileSystemXmlApplicationContext类、WebApplicationContext类。

1、    ClassPathXmlApplicationContext类创建
      ApplicationContext context=new ClassPathXmlApplicationContext(Sting configlocation);
通过参数指定spring的xml文件的位置来创建applicationContext容器。
2、FileSystemXmlApplicationContext类创建
     ApplicationContext context=new FileSystemXmlApplicationContext(Sting configlocation);
通过参数指定spring的xml文件的位置来创建applicationContext容器。
3、WebApplicationContext类创建
WebApplicationContext是spring的web容器,在Servlet中使用该类的方法有2种:一是在Servlet的web.xml文件中陪spring的ContextLoaderListener监听器;而是修改web.xml文件,在其中添加一个Servlet,定义使用spring的org.springframework.web.context.ContextLoaderServlet类。

依赖注入
1、    接口注入,Spring不支持。
2、    Setter注入,通过javaBean的setter方法为属性赋值,广泛应用。
3、    构造器注入,javaBean的有参构造方法给属性赋值。
Seter注入实例
User类
package com.User;

public class User {

    private Integer id;
    private String name;
    private String age;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    
    
}

在ApplicationContext.xml配置文件里添加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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- User实体 -->
    <bean name="user" class="com.User.User">
    <property name="id"><value>1</value></property>
    <property name="name"><value>小明</value></property>
    <property name="age"><value>15</value></property>
    </bean>
    
    </beans>
使用Manager类的main方法测试setter注入
public static void main(String[] args) {
        // TODO Auto-generated method stub
        //加载配置文件
        Resource resource=new ClassPathResource("applicationContext.xml");
        //初始化beanFactory
        BeanFactory factory=new XmlBeanFactory(resource);
        //获取Bean
        User user=(User)factory.getBean("user");
        //输出bean信息
        System.out.println(user.getId());
        System.out.println(user.getName());
        System.out.println(user.getAge());
        
    }
使用构造器注入
User类
package com.User;

public class User {

    private Integer id;
    private String name;
    private String age;
    //构造方法
    public User(Integer id,String name,String age){
        this.id=id;
        this.name=name;
        this.age=age;
        
    }
    //值输出方法
    public void printinfo(){
        System.out.println(id);
        System.out.println(name);
        System.out.println(age);
        
    }
    
    
}
applicationContext.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!-- User实体 -->
    <bean name="user" class="com.User.User">
    <!-- 构造器注入,要使用标签<constructor-arg> -->
    <constructor-arg><value>1</value></constructor-arg>
    <constructor-arg><value>小明</value></constructor-arg>
    <constructor-arg><value>15</value></constructor-arg>
    </bean>
    
    </beans>
Manager类的main测试方法
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //加载配置文件
        Resource resource=new ClassPathResource("applicationContext.xml");
        //初始化beanFactory
        BeanFactory factory=new XmlBeanFactory(resource);
        //获取Bean
        User user=(User)factory.getBean("user");
        //输出bean信息
        user.printinfo();
        
    }
引用其他Bean
User类
package com.US;

public class User {

    private Integer id;
    private String name;
    private String age;
…//省略setter和getter方法
applicationContext.xml文件配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     
     <!-- 注册User类到bean -->
     <bean id="user" class="com.US.User">
     <property name="id"><value>1</value></property>
     <property name="name"><value>xiaoming</value></property>
     <property name="age"><value>14</value></property>
     </bean>
    
    <!-- 注入javaBean -->
    <bean name="/main.do" class="com.US.Manager">
    <property name="user">
    <ref local="user"/>
    </property>
    </bean>
    
    </beans>
Manager类
package com.US;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;


//Manager继承Spring的AbstracController的控制器;AbstractController在web.servlet.mvc的jar包里
public class Manager extends AbstractController {
    //引入User类作属性,通过Spring注入到对象user
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    //实现handleRequestInternal抽象方法用来实在自己的业务逻辑
    protected ModelAndView handleRequestInternal(
            HttpServletRequest arg0,HttpServletResponse arg1) throws Exception{
        
        user.printinfo();//执行user的输出方法
        
        return null;
        
    }


}
Spring的配置文件ApplicationContext.xml要放到Web-Inf文件夹下,保证web.xml文件引用是可以找的到。项目启动时Spring自动加载ApplicationContext.xml文件配置信息。
Web.xml配置ApplicationContext.xml文件
<!-- 通过Servlet配置Spring的自动加载文件 -->
  <servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
  </servlet-mapping>
创建匿名内部JavaBean
    <!-- 创建匿名JavaBean -->
    <bean id="school" class="School">
    <property name="user">
    <bean class="com.US.User"/>
    </property>
    </bean>

Spring Aop
Aop术语
1、切面(aspect)
切面就是程序中的一段段互不相干的代码。
2、连接点(join Point)
连接点是指对象的一个操作,比如对象调用一个方法,或对象某个方法抛出异常等。
3、切入点(Pointuct)
切入点就是连接点的集合,可以理解为一段程序流中对象多个连接点的集合,也就是对象调用了多个方法,或抛出多个异常。
4、通知(advice)
通知就是在切入点处告诉程序要执行切面的业务逻辑。
5、目标对象(target)
被通知的对象就叫目标对象。也可以理解为被代理的对象。目标对象作业务处理。
6、织入(weaving)
织入是将切面功能应用到目标对象的过程,有代理工厂创建一个代理对象,代理对象可以为目标对象执行切面功能。
3种织入方式:编译时期(complie time)织入、类加载时期(Classlocad  time)织入、执行时期(runtime)织入。最常用的是执行时期织入。
9、引入(introduction)
对一个已编译的类(Class),在运行时期动态向其中加载属性和方法。

Spring的切入点
切入点的3种类型:静态切入点、动态切入点和自定义切入点。
静态切入点可以为对象的方法签名,对象调用对象的方法时,这个方法就是静态切入点。静态切入点需要在配置文件中指定。
<bean id=”pointAdvisor” class=”org.springframework.aop.support.RegexpMethodPointAdvisor”>
<property name=”advice”>
<ref bean=”MyAdvisor”/><!—指定通知-->
</property>
<property name=”patterns”>
<list>
<value>.*getConn*.</value><!—指定所以以getConn开头的方法都是切入点-->
<value>.*closeConn*.</value>
</list>
</property>
</bean>
由于静态切入点只在代理创建是执行一次,然后缓存结果。下一次调用时直接从缓存中读取即可,所以在性能上要远高于动态切入点。
但是当需要通知的目标对象的类型多于一种,而且需要织入的方法很多时,用静态切入点编程会很烦琐,并且不够灵活且会降低性能,这时可以选用动态切入点。

动态切入点
动态切入点可应用在相对变化的位置,如方法的参数上。由于程序运行过程中的传递的参数变化,切入点也随这变化,它会根据不同的参数来织入不同的切面。
深入静态切入点
静态切入点在某个方法名上织入切面,所以在织入程序代码前要匹配方法名,判断当前正在调用的方法是不是已经定义的静态切入点。匹配成功并织入切面;配置失败不织入切面。匹配的过程是有Spring自动实现,不需要编程的干预。
Spring中的其他切入点
切入点的实现类    说明
Org.springframework.support.JdkRegexpMethodPointcut    JDK正则表达式方法切入点
Org.springframework.support.NameMatchMethodPointcut    名称匹配器方法切入点
Org.springframework.support.StaticMatchMethodPointcut    静态方法匹配器切入点
Org.springframework.support.ControlFlowPointcut    流程切入点
Org.springframework.support.DynamicMethodMatcherPointcut    动态方法切入点

Spring持久化
Dao模式:Dao属于O/R Mapping技术的一种,通过O/R技术实现与RDBMS(关系数据库管理系统)的交互。
Spring的Dao理念
SpringDao框架存取数据时,通过一个数据存取接口来操作。
创建User类

public class User {

    private Integer id;
    private String name;
    private String age;
…//省略setter和getter
UserDaoimpl接口
public interface UserDaoimpl {
    public void inserUser(User user);//添加用户信息
}
UserDao实现

import java.sql.Connection;
import java.sql.Statement;

import javax.sql.DataSource;

public class UserDao implements UserDaoimpl {
    private DataSource datasource;
    
    
    
    public DataSource getDatasource() {
        return datasource;
    }

    public void setDatasource(DataSource datasource) {
        this.datasource = datasource;
    }


    //添加数据
    public void inserUser(User user){
        int id=user.getId();
        String name=user.getName();
        String age=user.getAge();
        
        Connection con=null;
        Statement st=null;
        try{
            con=datasource.getConnection();
            st=con.createStatement();
            st.execute("insert into tb_user(id,name,age) values ('"+id+"','"+name+"','"+age+"')");
            st.close();
            con.close();
        }catch(Exception e){
            e.printStackTrace();
        }

        
        
    }

}

applicationContext.xml配置信息
    <!-- 配置数据源 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName">
 <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
 <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
 </property>
 <property name="username">
 <value>system</value>
 </property>
 <property name="password">
 <value>guoyanan</value>
 </property>
 </bean>
 
 <!-- 注入UserDao注入数据 -->
 <bean id="userDao" class="com.US.UserDao">
 <property name="datasource" >
 <ref local="dataSource"/>
 </property>
 </bean>
Main方法执行
public static void main(String[] args){
         Resource resource = new ClassPathResource("applicationContext.xml");            //装载配置文件
            BeanFactory factory = new XmlBeanFactory(resource);
        
        User user=new User();
        user.setId(3);
        user.setName("xxx");
        user.setAge("12");
        
        
        UserDao userDAO = (UserDao) factory.getBean("userDao");//获取UserDAO
            userDAO.inserUser(user);//执行添加方法
        
        System.out.println("OK");
        
    }

事务管理
事务管理在应用程序中至关重要,它是一系列任务组的工作单元,其中的所有任务 必须同时执行。执行结果:全部成功和全部失败。
1、编程式事务管理
Sping中主要有2中编程式事务管理实现方法,分别通过使用Plaform  Transaction  Manager接口的事务管理器或Transaction  Template实现。推荐使用Transaction  Template实现方式,符合Spring的模版模式。
在Spring配置文件中声明事务管理器和TransactionTemplate。
<!-- 配置数据源 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName">
 <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
 <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
 </property>
 <property name="username">
 <value>system</value>
 </property>
 <property name="password">
 <value>guoyanan</value>
 </property>
 </bean>
 
    
    <!-- 定义TransactionTemplate模版 -->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager">
    <ref bean="transactionManager"/>
    </property>
    <property name="propagationBehaviorName">
    <!-- 限定事务的传播行为,规定当前方法必须运行在事务中,
    如果没有事务,则创建一个。一个新的事务和方法同时开始,
    随这方法返回或抛出异常终止。 -->
    <value>PROPAGATION_REQUIRED</value>
    </property>
    </bean>
    <!-- 定义事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>
    <!-- 注入事务管理器 -->
    <bean id="transactionExample" class="com.US.TranscationExample">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    <property name="transactionManager">
    <ref bean="transactionManager"/>
    </property>
    <property name="transactionTemplate">
    <ref bean="transactionTemplate"/>
    </property>
    
    </bean>
创建类transactionExample。
public class TranscationExample {
    //注入数据源
    DataSource dataSource;
    //注入事务管理器
    PlatformTransactionManager  transactionManager;
    //注入事务管理模版
    TransactionTemplate  transactionTemplate;
    public DataSource getDataSource() {
        return dataSource;
    }
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    public PlatformTransactionManager getTransactionManager() {
        return transactionManager;
    }
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }
    public TransactionTemplate getTransactionTemplate() {
        return transactionTemplate;
    }
    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
    
   public void transactionOpen(){
       transactionTemplate.execute(new TransactionCallback(){

        @Override
        public Object doInTransaction(TransactionStatus arg0) {
            // TODO Auto-generated method stub
            //获取数据库链接
            Connection con=DataSourceUtils.getConnection(dataSource);
            try{
                Statement st=con.createStatement();
                
                st.execute("insert into tb_user (id,name,age) values('5','jj','14')");
                
            }catch(Exception e){
                transactionManager.rollback(arg0);
                System.out.println("插入操作执行失败");
                e.printStackTrace();
            }
            
            
            return null;
        }   
       });
       
   }
    
}
Manager类测试
Resource resource = new ClassPathResource("applicationContext.xml");            //装载配置文件
            BeanFactory factory = new XmlBeanFactory(resource);
        
            TranscationExample  trans=(TranscationExample)factory.getBean("transactionExample");
        
            trans.transactionOpen();
声明式事务管理
在Spring中常用TransactionProxyFactoryBean完成声明式事务管理。
<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
     
     <!-- 配置数据源 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName">
 <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
 <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
 </property>
 <property name="username">
 <value>system</value>
 </property>
 <property name="password">
 <value>guoyanan</value>
 </property>
 </bean>
 
    
    <!-- 定义事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>
    
    <!-- 定义TransactionProxy -->
    <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
    <ref local="transactionManager"/>
    </property>
    <property name="target">
    <!-- 以内部类的形式指定代理对象 -->
    <bean id="UserDao" class="com.US.UserDao">
    <property name="dataSource">
    <ref local="dataSource"/>
    </property>
    </bean>
    </property>
    <property name="proxyTargetClass" value="true"/>
    <property name="transactionAttributes">
    <props>
    <!-- 通过正则表达式匹配事务性方法,并指定方法的事务属性,即代理
    对象中只要是以add开头的方法名必须运行在事务中 -->
    <prop key="inser*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
    
    
    </beans>
UserDao类代理对象
public class UserDao extends JdbcDaoSupport {
    //添加数据
    public void inserUser(User user){
        //执行添加的sql语句
            String sql="insert into tb_user(id,name,age) values ('"+user.getId()+"','"+user.getName()+"','"+user.getAge()+"')";
            
            //执行添加方法
            getJdbcTemplate().execute(sql);
        
        
    }

}
Manager类的main执行方法
public static void main(String[] args){
         Resource resource = new ClassPathResource("applicationContext.xml");            //装载配置文件
            BeanFactory factory = new XmlBeanFactory(resource);
        
            UserDao  userdao=(UserDao)factory.getBean("transactionProxy");
        
            User user=new User();
            user.setId(7);
            user.setName("ll");
            user.setAge("17");
            //执行添加方法
            userdao.inserUser(user);
            
        System.out.println("OK");
        
    }
应用jdbcTemplate操作数据库
JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core包中找到。该类在内部已经处理了数据库资源的建立和释放,避免一些常见的错误。
JdbcTemplate中常用的数据查询方法
方法名称    说明
Int  QueryForInt(String sql)    返回查询的数量
Int  QueryForInt(String sql,Object[]  args)    
Long QueryForLong(String sql)    返回查询信息的数量
Long QueryForLong(String sql,Object[] args)    
Object  QueryForObject(String sql,Class  type)    返回满足条件的查询对象
Object  QueryForObject(String sql,Class  type,object args)    
List  QueryForList(String sql)    返回对象List集合
List  QueryForList(String sql,Object[] args)    

配置JdbcTemplate和数据源
    <!-- 配置数据源 -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName">
 <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
 <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
 </property>
 <property name="username">
 <value>system</value>
 </property>
 <property name="password">
 <value>guoyanan</value>
 </property>
 </bean>
 
    <!-- 配置jdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource">
    <ref local="dataSource"/>
    </property>
     </bean>
Main测试方法
Resource resource = new ClassPathResource("applicationContext.xml");            //装载配置文件
            BeanFactory factory = new XmlBeanFactory(resource);
        
            JdbcTemplate  jdbc=(JdbcTemplate)factory.getBean("jdbcTemplate");
            jdbc.update("insert into tb_user (id,name,age) values('8','jj','14')");
           
            















                        
原文地址:https://www.cnblogs.com/gynbk/p/6556319.html