建立一個普通的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這個接口。