Spring 2.5框架学习笔记

1.是一个开源的控制反转IOC和面向切面AOP的容器框架

2.IOC控制反转

public class PersonServiceBean {
private PersonDao personDao = new PersonDao();
publiv void save(Person person){
personDao.save(person);
}
}

控制反转:应用本身不负责依赖对象personDao的创建以及维护,依赖对象的创建以及维护是由外部容器负责的,这样控制权就由应用转移到了外部的容器,控制权的转移就是反转。

3.依赖注入(Dependency injection) :

依赖注入:在运行期间由外部容器动态地将依赖对象注入到组件中

改写的PersonServiceBean

public class PersonServiceBean {
private PersonDao persondao;
public PersonServiceBean(PersonDao persondao){
this.persondao=persondao;
}
public void save(Person person){
persondao.save(person);
}
}

利用了构造器,让容器把创建好的对象注入到PersonServiceBean,在构造器中将Dao层的对象注入到了业务层。

4.Spring不需要手工控制事务

5.重量级还是轻量级变量?

java对象做得工作就越多,影响到应用的发布时间和运行性能。这时就是重量级的。对于spring容器,如果仅仅使用核心的服务,就是轻量级的。

6.环境搭建:

 

 

7.配置文件beans.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-2.5.xsd">
<bean id="personService" class="test.PersonServiceBean"></bean>
</beans>

8.spring的第一例子

//抽取的接口
package impls;
public interface PersonService {
public abstract void save();
}
//接口的实现方法
package service;
import impls.PersonService;
public class PersonServiceBean implements PersonService {
/* (non-Javadoc)
 * @see service.impl.PersonService#save()
 */
public void save(){
System.out.println("save function");
}
}
 
package test;
import impls.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void setUpBeforeClass(){
}
public static void instanceSpring(){
//根据配置文件,创建一个spring容器的实例
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//从容器中,根据id,取得业务层对象
PersonService ps =(PersonService)ctx.getBean("personService");
//调用业务层对象的方法
ps.save();
}
}
 
9.spring实例化bean的3种方法?最常用的是第一种,其他看到了读得懂就行。
<?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-2.5.xsd">
        <!-- 创建了bean,由容器维护,即将bean放在了容器中 -->
        <!-- 类的构造器实例化 -->
        <bean id="personService" class="service.PersonServiceBean"></bean>
        <!-- 静态工厂实例化 -->
        <bean id="personService2" class="service.PersonServiceBeanFactory" factory-method="createPersonService"></bean>
        <!-- 动态工厂方法实例化 -->
        <bean id="personServiceFactory" class="service.PersonServiceBeanFactory" >  </bean>
        <bean id="personService3" factory-bean="personServiceFactory" factory-method="createPersonService2"> </bean>
</beans>
 
package service;
public class PersonServiceBeanFactory {
//静态的工厂方法,createPersonService
//返回一个PersonServiceBean对象
public static PersonServiceBean createPersonService(){
return new PersonServiceBean();
}
//实例工厂方法
public PersonServiceBean createPersonService2(){
return new PersonServiceBean();
}
}

 

10.两次调用方法getBean(),是不是引用的是同一个对象?

是同一个对象,即使一个单实例对象。

默认:singleton作用域,单例模式,bean的实例化在创建容器时

在prototype作用域下,每次调用会返回一个新的对象bean的实例化在容器调取bean

<bean id="personService" class="service.PersonServiceBean" scope="prototype"></bean>
scope="prototype"    scope="singleton"
setter方法注入:
11.类对象类型的注入
<!-- 类的构造器实例化 -->
<bean id="personDao" class="dao.PersonDaoBean"></bean>
<bean id="personService" class="service.PersonServiceBean" >
<property name="personDao" ref="personDao"></property>
</bean>

理解:ref的值是第一个bean的id,property的name为定义的属性(你要注入的一个类的对象),在PersonServiceBean中一定定义了personDao对象的属性

dao.PersonDaoBean是这样定义的:
package dao;
import impls.PersonDao;
public class PersonDaoBean implements PersonDao {
public void add() {
System.out.println("执行PersonDaoBean中的add方法");
}
}
PersonSeviceBean是这样定义的:
package service;
import impls.PersonDao;
import impls.PersonService;
public class PersonServiceBean implements PersonService {
//属性为PersonDao类对象
    private PersonDao personDao;
    
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
    //重写接口中的save方法
public void save(){
personDao.add();
}
}
11.采用内部bean的方式注入bean
<!-- 采用内部bean的方法 -->
<bean id="personService" class="service.PersonServiceBean">
<property name="personDao">
<bean class="dao.PersonDaoBean"></bean>
</property>
</bean>
12.基本类型数据的bean注入,由property标签控制
<bean id="personDao" class="dao.PersonDaoBean"></bean>
<bean id="personService" class="service.PersonServiceBean">
<property name="personDao" ref="personDao"></property>
<property name="username" value="admin"></property>
</bean> 
业务层这样写:
package service;
import impls.PersonDao;
import impls.PersonService;
public class PersonServiceBean implements PersonService {
//属性为接口PersonDao
private PersonDao personDao;
//定义的基本数据类型,一定要提供get/set方法
    private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
重写接口中的save方法
public void save(){
personDao.add();
System.out.println("name:"+username);
}
}
 
13.集合类型的注入,也是由property控制:
Set类型:
<bean id="personDao" class="dao.PersonDaoBean"></bean>
<bean id="personService" class="service.PersonServiceBean">
<property name="personDao" ref="personDao"></property>
<property name="username" value="admin"></property>
<property name="id" value="123"></property>
<property name="sets">
<set>
<value>admin1</value>
<value>admin2</value>
<value>admin3</value>
</set>
</property>
</bean>
List类型:
<property name="lists">
<list>
<value>admin4</value>
<value>admin5</value>
<value>admin6</value>
</list>
</property>
map类型:
<property name="maps">
<map>
<entry key="key-1" value="value-1"></entry>
<entry key="key-2" value="value-2"></entry>
<entry key="key-3" value="value-3"></entry>
</map>
</property>
业务层:
package service;
import impls.PersonDao;
import impls.PersonService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class PersonServiceBean implements PersonService {
//定义类对象的属性personDao
    private PersonDao personDao;
    //定义基本数据类型username id
    private String username;
private int id;
//定义集合属性sets
private Set<String> sets = new HashSet<String>();
//定义集合属性lists
private List<String> lists = new ArrayList<String>();
//定义属性集合maps
private Map<String,String> maps = new HashMap<String,String>();
public Map<String, String> getMaps() {
return maps;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
public Set<String> getSets() {
return sets;
}
public void setSets(Set<String> sets) {
this.sets = sets;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
    //重写接口中的save方法
public void save(){
personDao.add();
System.out.println("name:"+username);
System.out.println("id:"+id);
}
}
客户端调用:
举例:对于map集合
package test;
import impls.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void setUpBeforeClass(){
 
}
public static void instanceSpring(){
//根据配置文件,创建一个spring容器的实例
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//从容器中,根据id,取得对象
PersonService ps =(PersonService)ctx.getBean("personService");
for(String key :ps.getMaps().keySet()){
System.out.println("value:"+ps.getMaps().get(key));
}
}
}
接口申明:
注意:在PersonServiceBean 中实现的是PersonService 接口,所以 ,接口中的定义有取得集合元素的方法:
package impls;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface PersonService {
public abstract void save();
public Set<String> getSets();
public List<String> getLists();
public Map<String, String> getMaps();
}
对于集合类型都为XXXGet方法,取得集合中的元素值。
构造器注入
14.配置文件:
<bean id="personDao" class="dao.PersonDaoBean"></bean>
<bean id="personService" class="service.PersonServiceBean">
<!-- 利用构造器参数注入 -->
<!-- 为第一个参数注入值 ,ref为要注入的对象 type为接口名-->
<constructor-arg index="0" type="impls.PersonDao" ref="personDao"></constructor-arg>
<!-- 为第二个参数注入值,基本数据类型不用指定type,value为要注入的值
<constructor-arg index="1"  value="xjq"></constructor-arg>
我的理解:构造器注入是,利用constructor属性,类对象用ref,基本数据类型用value指定
业务层:
//演示构造器注入两个属性personDao和username,一定要提供构造器方法
public PersonServiceBean(PersonDao personDao, String username) {
this.personDao = personDao;
this.username = username;
}
//定义类对象的属性personDao
   private PersonDao personDao;
    //定义基本数据类型username
   private String username;
     //重写接口中的save方法
   public void save(){
System.out.println("name:"+username);
personDao.add();
}
}
客户端的调用:
package test;
import impls.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void instanceSpring(){
//根据配置文件,创建一个spring容器的实例
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
//从容器中,根据id,取得对象
PersonService ps =(PersonService)ctx.getBean("personService");
ps.save();
}
}
最后的输出:
name:xjq
执行PersonDaoBean中的add方法
 
15.有了注解的配置文件:
<?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-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>        <beanid="personDaoxxxx"class="cn.itcast.dao.impl.PersonDaoBean"></bean>
<beanid="personService"class="cn.itcast.service.impl.PersonServiceBean">
</bean>
</beans>

 

 

 

 

 

16.利用注解字段的方式,进行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:context="http://www.springframework.org/schema/context"       
       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">
          
          <context:annotation-config/>
          <!--这些bean都是用来定义实体类的-->
          <bean id="personDao" class="dao.PersonDaoBean"></bean>
          <bean id="personService" class="service.PersonServiceBean"></bean>
</beans>
业务层:
@Resource修饰属性
package service;
import impls.PersonDao;
import impls.PersonService;
import javax.annotation.Resource;
public class PersonServiceBean implements PersonService {
//定义类对象的属性personDao
@Resource private PersonDao personDao;
    //定义基本数据类型username id
     private String username;
    //重写接口中的save方法
public void save(){
personDao.add();
}
}
 
17.利用注解setter的方式,进行bean的注入
@Resource修饰set方法
package service;
import impls.PersonDao;
import impls.PersonService;
import javax.annotation.Resource;
public class PersonServiceBean implements PersonService {
//定义类对象的属性personDao
private PersonDao personDao;
为字段的set方法加@Resource注解,配置文件不变
@Resource
    public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
 
//定义基本数据类型username id
    private String username;
    //重写接口中的save方法
public void save(){
personDao.add();
}
}
 
18.利用@Autowired进行依赖注入
是一种按照类型进行装配
业务层:
@Autowired利用该注释修饰属性
package service;
import impls.PersonDao;
import impls.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
public class PersonServiceBean implements PersonService {
//定义类对象的属性personDao
@Autowired private PersonDao personDao;
 
    public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
    //重写接口中的save方法
public void save(){
personDao.add();
}
}
配置文件:
<?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-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
          
          <context:annotation-config/>
          
          <bean id="personDao" class="dao.PersonDaoBean"></bean>
          <bean id="personService" class="service.PersonServiceBean"></bean>
</beans>
 
19.自动装配,但是不推荐,会有很多意外的情况
 
20.AOP技术
 
 
 
 
 
 
自己利用jdk编写:
目标类接口:
package aop;
public interface PersonService {
public void save(String name);
public void update(String name,Integer personId);
public String getPersonName(Integer personId);
}
业务层:
package aop_service;
import aop.PersonService;
//业务层:PersonServiceBean
/*
 * 拦截用户对方法的请求
 * 判断用户是否有权限(user是否为null)执行业务方法
 * 有则执行,没有的话就不执行
 *
 * */
public class PersonServiceBean implements PersonService {
//定义一个用户user
private String user = null;
 
public String getUser() {
return user;
}
 
//构造器
    public PersonServiceBean(String user) {
this.user = user;
}
 
public PersonServiceBean() {
super();
// TODO Auto-generated constructor stub
}
 
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("我是save方法");
}
 
public void update(String name, Integer personId) {
// TODO Auto-generated method stub
System.out.println("我是update方法");
}
 
public String getPersonName(Integer personId) {
// TODO Auto-generated method stub
return "admin";
}
}
代理工厂:
package aop_service;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyFactory implements java.lang.reflect.InvocationHandler {
//定义一个目标对象
private Object targetObject;
//创建代理实例
public Object createProxyInstance(Object targetObject){
this.targetObject=targetObject;
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(),this);
}
//返回一个代理对象
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if(bean.getUser()!=null){
result = method.invoke(targetObject, args);
}
return result;
}
}
 
测试:
package test;
import aop.PersonService;
import aop_service.JDKProxyFactory;
import aop_service.PersonServiceBean;
 
public class aopTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建代理工厂
JDKProxyFactory ff = new JDKProxyFactory();
//返回代理对象
PersonService ps = (PersonService)ff.createProxyInstance(new PersonServiceBean("xxx"));
ps.save("888");
}
}
 
21.利用spring进行aop开发
前置通知 后置通知  最终通知 环绕通知 异常通知
一定要引入的jar包:
 
配置文件:
<?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"      
       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.5.xsd">
        <aop:aspectj-autoproxy/>
        <!-- 将切面类交给spring容器去管理 -->
        <bean id="myInterceptor" class="aop.MyInterceptor"/>
        <!-- 将业务bean也交给spring管理 -->
        <bean id="personService" class="aop_service.PersonServiceBean"></bean>
</beans>
利用注解的方法进行:
切面类和切入点的定义:
package aop;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
 
//申明该类为一个切面 ,该切面应该交由spring容器进行管理,基于xml配置去管理
@Aspect 
public class MyInterceptor {
//申明一个切入点
@SuppressWarnings("unused")
@Pointcut("execution(* aop_service.PersonServiceBean.*(..))")
private void anyMethod(){}
 
//在执行业务方法前,前置通知
@Before("anyMethod()")
public void doAccessCheck(){
System.out.println("前置通知");
}
//在执行业务方法后,后置通知
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知");
}
      //最终的通知
@After("anyMethod()")
public void doAfter(){
System.out.println("最终通知");
}
}
业务层:
package aop_service;
import aop.PersonService;
//业务层:PersonServiceBean
/*
 * 拦截用户对方法的请求
 * 判断用户是否有权限(user是否为null)执行业务方法
 * 有则执行,没有的话就不执行
 *
 * */
public class PersonServiceBean implements PersonService {
 
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("我是save方法");
}
 
public void update(String name, Integer personId) {
// TODO Auto-generated method stub
System.out.println("我是update方法");
}
 
public String getPersonName(Integer personId) {
// TODO Auto-generated method stub
System.out.println("我是getPersonName方法");
return "admin";
}
}
测试类:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import aop.PersonService;
public class SpringAopTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建spring容器
ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
//容器先取得业务层的bean
PersonService ps = (PersonService)cxt.getBean("personService");
//调用业务层对象的save方法
ps.save("xxx");
}
}
输出:
 
 
 
22.环绕通知
//环绕通知
@Around("anyMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入方法");
Object result  = pjp.proceed();
System.out.println("退出方法");
return result;
}
 
环绕通知经常可以用于权限控制
23.利用xml进行配置aop
配置文件:
<?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"
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.5.xsd">
<aop:aspectj-autoproxy />
<!-- 将业务bean也交给spring管理 -->
<bean id="personService" class="aop_service.PersonServiceBean"></bean>
     <!-- 将拦截类对象交给  spring管理-->
<bean id="aspetbean" class="aop.MyInterceptor"></bean>
<aop:config>
<aop:aspect id="asp" ref="aspetbean">
<aop:pointcut id="mycut"
expression="execution(* aop_service.PersonServiceBean.*(..))"/>
<aop:before pointcut-ref="mycut" method="doAccessCheck" />
</aop:aspect>
</aop:config>
</beans>
业务层:拦截bean,是一个普通的类对象
package aop;
import org.aspectj.lang.ProceedingJoinPoint;
//申明该类为一个切面 ,该切面应该交由spring容器进行管理,基于xml配置去管理
public class MyInterceptor {
//在执行业务方法前,前置通知
public void doAccessCheck(){
System.out.println("前置通知");
}
//在执行业务方法后,后置通知
public void doAfterReturning(){
System.out.println("后置通知");
}
//最终的通知
public void doAfter(){
System.out.println("最终通知");
}
//环绕通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("进入方法");
Object result  = pjp.proceed();
System.out.println("退出方法");
return result;
}
}
普通的业务类对象:
package aop_service;
import aop.PersonService;
public class PersonServiceBean implements PersonService {
 
public void save(String name) {
// TODO Auto-generated method stub
System.out.println("我是save方法");
}
public void update(String name, Integer personId) {
// TODO Auto-generated method stub
System.out.println("我是update方法");
}
public String getPersonName(Integer personId) {
// TODO Auto-generated method stub
System.out.println("我是getPersonName方法");
return "admin";
}
}
测试文件:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import aop.PersonService;
 
public class SpringAopTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建spring容器
ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
//容器先取得业务层的bean
PersonService ps = (PersonService)cxt.getBean("personService");
//调用业务层对象的save方法
ps.save("xxx");
}
}

 

24.expression="execution(* aop_service.PersonServiceBean.*(..))的理解

返回值类型为所有类型 用 .  表示 ,可以拦截aop_service包下的PersonServiceBean类的所有的方法,参数类型为所有的类型,用 . . 表示。

!可以取反     !void  拦截不是void类型的

25.aop适合权限系统的使用
26.spring+jdbc组合开发
beans.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" 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.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!-- 启用占位符,配置数据库连接 -->
	<context:property-placeholder location="classpath:jdbc.properties" />
	<!-- 控制数据连接 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${driverClassName}" />
		<property name="url" value="${url}" />
		<property name="username" value="${username}" />
		<property name="password" value="${password}" />
		<!-- 连接池启动时的初始值 -->
		<property name="initialSize" value="${initialSize}" />
		<!-- 连接池的最大值 -->
		<property name="maxActive" value="${maxActive}" />
		<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
		<property name="maxIdle" value="${maxIdle}" />
		<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
		<property name="minIdle" value="${minIdle}" />
	</bean>
	<!-- 事务管理器 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 对注解进行解析没,需要指定一个事务管理器 -->
	<tx:annotation-driven transaction-manager="txManager" />
    <!-- 基于xml将dataSource属性注入 -->
	<bean id="personService" class="JDBCSpring.PersonServiceBean">
		<property name="dataSource" ref="dataSource" />
	</bean>
</beans>
数据库配置的属性文件jdbc.properties:
driverClassName=org.gjt.mm.mysql.Driver
url=jdbc\:mysql\://localhost\:3306/demo?useUnicode\=true&characterEncoding\=UTF-8
username=root
password=
initialSize=1
maxActive=500
maxIdle=2
minIdle=1
业务类:
package JDBCSpring;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import bean.Person;
public class PersonServiceBean implements JDBCSpring.PersonService {
	private JdbcTemplate jdbcTemplate;
 
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
 
	public void delete(Integer personid) {
		jdbcTemplate.update("delete from person where id=?", new Object[]{personid},
				new int[]{java.sql.Types.INTEGER});
	}
 
	public Person getPerson(Integer personid) {		
		/*return (Person)jdbcTemplate.queryForObject("select * from person where id=?", new Object[]{personid}, 
				new int[]{java.sql.Types.INTEGER}, new PersonRowMapper());*/
		return null;
	}
	public List<Person> getPersons() {
		//return (List<Person>)jdbcTemplate.query("select * from person", new PersonRowMapper());
	   return null;
	}
	public void save(Person person) {
		jdbcTemplate.update("insert into person(name) values(?)", new Object[]{person.getName()},
				new int[]{java.sql.Types.VARCHAR});
	}
	public void update(Person person) {
		jdbcTemplate.update("update person set name=? where id=?", new Object[]{person.getName(), person.getId()},
				new int[]{java.sql.Types.VARCHAR, java.sql.Types.INTEGER});
	}
}

实例类:

package bean;
public class Person {
	public Person(String name) {
		this.name = name;
	}
	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;
	}
	private Integer id;
	private String name;
}

 

 

测试类:

package JDBCSpring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import bean.Person;
public class jdbcTest {
	public static void main(String[] args) {
		ApplicationContext act = new ClassPathXmlApplicationContext("beans.xml");
		PersonService ps = (PersonService) act.getBean("personService");
		ps.save(new Person("haha"));
		System.out.println("ok!");
	}
}

 

 

带着热忱学技术,带着耐心做技术,带着分享去交流,带着微笑探我们的程序人生!