新建一个普通的java项目,添加spring功能(3.x),不要使用MyEclipse提供的jar包,自己手动添加需要的jar包(commons-logging.jar、spring.jar);
IoC控制反转:
Hello.java
package domain;
public class Hello {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String toString(){
return "hello " + msg;
}
}
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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="hello" class="domain.Hello">
<property name="msg" value="lmb"></property><!-- 通过Hello实体类中的setMsg()方法并msg成员变量的值注入 -->
</bean>
</beans>
TestHello.java:
package web;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import domain.Hello;
public class TestHello {
/**
* 注意体会控制反转IoC的思想
*/
public static void main(String[] args) {
//*****通过new来创建对象**************************
Hello hello1=new Hello();
System.out.println(hello1); //hello null
//****通过spring框架来创建对象****************************
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("applicationContext.xml");//加载配置文件
Hello hello2=(Hello)applicationContext.getBean("hello");
//利用applicationContext得到bean,注意这里的"hello"与applicationContext.xml中<bean>配置中的id对应
System.out.println(hello2);//hello lmb
//我们在applicationContext.xml配置文件中的<bean>在的<property>中为Hello实体类中的msg属性配置了一个"lmb"的值
}
}
总结:
普通创建对象时,我们通过new来控制对象的生命周期,使用IoC之后,控制反转IoC的思想就是:把管理对象的生命周期的控制权交给spring框架,使用spring框架来构建对象,由spring框架来管理对象生命周期的开始和结束。
DI依赖注入:
TestUser.java:
package web;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import Manager.UserManager;
import domain.User;
public class TestUser {
/**
* 注意体会依赖注入DI的思想
*/
public static void main(String[] args) {
User user=new User();//该User对象是从前台页面获取的
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager=(UserManager)applicationContext.getBean("userManager");
//通过applicationContext.xml配置文件获取UserManager对象和它的实现,同时也就能获取到UserDao对象和它的实现
//控制层调用业务逻辑层处理业务逻辑
userManager.addUser(user); //JDBC insert User.......
}
}
UserManagerImpl.java
package Manager;
import dao.UserDao;
import domain.User;
public class UserManagerImpl implements UserManager {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser(User user) {
// 业务逻辑层调用持久层进行数据持久化处理
//使用普通的方法是用new的方法构建一个UserDao对象
//UserDao userDao=new UserDaoImpl();
//注意这里没有给出UserDao的实现,UserDao的实现是通过配置文件注入的
userDao.insertUser(user);
}
}
UserDaoImpl.java
package dao;
import domain.User;
public class UserDaoImpl implements UserDao {
public void insertUser(User user) {
//持久层使用JDBC的方式将数据持久化到数据库中,这里用一个打印语句代替
System.out.println("JDBC insert User.......");
}
}
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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- UserDaoImpl中没有需要注入的属性 -->
<bean id="userDao" class="dao.UserDaoImpl"></bean>
<!-- UserManagerImpl中需要将userDao的实现注入 -->
<bean id="userManager" class="Manager.UserManagerImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
总结:
在UserManagerImpl.java中我们只声明了UserDao对象,并没有给出它的实现,它的实现是通过applicationContext.xml配置文件中UserManager的配置依赖注入的。
AOP面向切面编程
在上面项目的基础上再添加一个UserDaoHibernateImpl.java
UserDaoHibernateImpl.java:
package dao;
import domain.User;
public class UserDaoHibernateImpl implements UserDao{
public void insertUser(User user) {
//持久层使用Hibernate的方式将数据持久化到数据库中,这里用一个打印语句代替
System.out.println("Hibernate insert User.....");
}
}
修改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"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- UserDaoImpl中没有需要注入的属性 -->
<bean id="userDao" class="dao.UserDaoImpl"></bean>
<bean id="userDaoHibernate" class="dao.UserDaoHibernateImpl"></bean>
<!-- UserManagerImpl中需要将userDao的实现注入 -->
<bean id="userManager" class="Manager.UserManagerImpl">
<!-- <property name="userDao" ref="userDao"></property> -->
<property name="userDao" ref="userDaoHibernate"></property>
</bean>
</beans>
TestUser.java会输出Hibernate insert User…..
总结:
开闭原则:对代码的修改关闭,对代码的添加打开;
spring有解耦的作用,需要面向接口编程,在本例中UserDaoImpl和UserDaoHibernateImpl都实现了UserDao这个接口。