天天看點

【Spring學習】IoC、DI、AOP入門學習

建立一個普通的java項目,添加spring功能(3.x),不要使用MyEclipse提供的jar包,自己手動添加需要的jar包(commons-logging.jar、spring.jar);

IoC控制反轉:

【Spring學習】IoC、DI、AOP入門學習

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依賴注入:

【Spring學習】IoC、DI、AOP入門學習

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

【Spring學習】IoC、DI、AOP入門學習

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這個接口。

繼續閱讀