Spring學習筆記--Spring IOC

沿着咱們上一篇的學習筆記,咱們繼續經過代碼學習IOC這一設計思想.java

6.Hello類mysql

第一步:首先建立一個類Hellospring

package cn.sxt.bean;

public class Hello {
    private String name;
    public void setName(String name) {
		this.name = name;
	}
    public void show(){
    	System.out.println("hello,"+name);
    }
}

第二步:建立配置文件beans.xmlsql

<?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.xsd">
    <!-- bean就是java對象,由spring容器來建立和管理 -->
    <bean name="hello" class="cn.sxt.bean.Hello">
        <property name="name" value="張三"></property>
    </bean>
</beans>

第三步:編寫測試類Testapache

package cn.sxt.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.sxt.bean.Hello;

public class Test {
	public static void main(String[] args) {
		//解析beans.xml文件生成管理相應的bean對象
		ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
		Hello hello=(Hello)context.getBean("hello");
		hello.show();
	}
}

咱們須要導入相關Jar包(在上一篇筆記Spring主要內容中顯示的那些核心jar包)編程

此時運行Test程序,會觸發異常:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactoryoracle

咱們須要添加commons-logging.jar文件函數

步驟總結:學習

1)導入相關jar包測試

2)編寫spring配置文件(名稱能夠自定義)

思考?

  Hello對象是誰建立的?

咱們在Hello類中添加一個構造函數,能夠肯定Hello對象肯定被建立:

package cn.sxt.bean;

public class Hello {
	public Hello() {
		System.out.println("hello 被建立");
	}
    private String name;
    public void setName(String name) {
		this.name = name;
	}
    public void show(){
    	System.out.println("hello,"+name);
    }
}

運行Test測試類結果顯示:

hello 被建立
hello,張三

由此能夠得知,Hello對象是由spring容器來建立的:bean工廠,能夠包含多個bean,建立不一樣類的對象

<bean name="hello" class="cn.sxt.bean.Hello">
        <property name="name" value="張三"></property>
    </bean>

  Hello對象的屬性是怎樣設置的?

Hello對象的屬性是由spring容器來設置的;

這個過程就叫作控制反轉:

控制的內容:指的是誰來控制對象的建立;傳統的應用程序,對象的建立是由程序自己來控制,使用Spring之後是由spring來建立對象的。

反轉:有反轉就有正轉,正轉指程序來建立對象,反轉指程序自己不去建立對象,而變爲被動的接收容器給咱們建立的對象

總結:之前對象是由程序自己來建立,使用spring後,程序變爲了被動接收spring建立好的對象;

控制反轉有一個別名--依賴注入(DI-dependency injection)

DI:好比在咱們的Hello類中,咱們的類Hello就依賴於name屬性,以來的這個name屬性是由spring容器來設置的,name值的設置過程就叫作依賴注入(經過setName方法進行的依賴注入)

Ioc--是一種編程思想,由主動編程變爲別動接收;

Ioc的實現是經過Ioc容器(Bean工廠)來實現的。Ioc容器--BeanFactory

在第一篇學習筆記中的UserDao和UserDaoService的例子,咱們在這裏就能夠使用spring配置文件的方式來管理對象的生命週期以及依賴對象的注入;

beanx.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.xsd">
    <!-- bean就是java對象,由spring容器來建立和管理 -->
    <bean id="mysqlDao" class="cn.sxt.dao.impl.UserDaoMySqlImpl"></bean>
    <bean id="oracleDao" class="cn.sxt.dao.impl.UserDaoOracleImpl"></bean>
    <bean id="service" class="cn.sxt.service.impl.UserServiceImpl">
        <!-- ref引用對象(對象是由spring來建立的) -->
        <property name="userDao" ref="mysqlDao"></property>
    </bean>
    <!-- property如何設置:name="setUserDao(去除set,並將剩餘的UserDao首字母小寫)" -->
</beans>

當咱們須要替換具體的實現時,就能夠直接在配置文件中進行修改,例如將ref="mysqlDao"修改成ref="oracleDao";
在測試類中咱們就能夠這樣來組織代碼:

package cn.sxt.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.sxt.service.UserService;

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
		UserService us=(UserService)ac.getBean("service");
		us.getUser();
	}
}

使用IOC來建立對象的方式:3種方式

1)經過無參的構造方法來建立;

User.java:

package cn.sxt.vo;

public class User {
	public User(){
		System.out.println("user的無參構造方法");
	}
	private String name;
	public void setName(String name) {
		this.name = name;
	}
	public void show(){
		System.out.println("name="+name);
	}
}

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.xsd">
   <bean id="user" class="cn.sxt.vo.User">
           <property name="name" value="張三"></property>
   </bean>
</beans>

Test:

package cn.sxt.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.sxt.vo.User;

public class Test {

	public static void main(String[] args) {
		ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
		User user=(User)ac.getBean("user");
		user.show();
	}

}

2)經過有參構造方法來建立;

User.java:

package cn.sxt.vo;

public class User {
	private String name;
	
	public User(String name) {
		super();
		this.name = name;
	}

	public void show(){
		System.out.println("name="+name);
	}
}

beans.xml配置(有三種狀況):

第一種:根據參數的下標(index)來設置;

<?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.xsd">
   <bean id="user" class="cn.sxt.vo.User">
           <!-- index指的是構造方法參數下標,從0開始 -->
           <constructor-arg index="0" value="李四"></constructor-arg>
   </bean>
</beans>

第二種:根據參數名稱(name)來設置;

<bean id="user" class="cn.sxt.vo.User">
           <!-- name指的是屬性值 -->
           <constructor-arg name="name" value="王五"></constructor-arg>
   </bean>

第三種:根據參數類型(type)來設置;

 <bean id="user" class="cn.sxt.vo.User">
           <constructor-arg type="java.lang.String" value="徐六"></constructor-arg>
   </bean>

3)經過工廠方法來建立對象(有兩種);
第一種:靜態工廠來建立;

UserFactory.java:

package cn.sxt.factory;

import cn.sxt.vo.User;

public class UserFactory {
	public static User newInstance(String name){
		return new User(name);
	}
}

beans.xml配置:

<bean id="user" class="cn.sxt.factory.UserFactory" factory-method="newInstance">
           <constructor-arg index="0" value="任七"></constructor-arg>
   </bean>

第二種:動態工廠來建立

UserDynamicFacory.java:

package cn.sxt.factory;

import cn.sxt.vo.User;

public class UserDynamicFactory {
	public  User newInstance(String name){
		return new User(name);
	}
}

beans.xml:

<bean id="userFacotry" class="cn.sxt.factory.UserDynamicFactory"/>
    <bean id="user" factory-bean="userFacotry" factory-method="newInstance">
        <constructor-arg index="0" value="王五"/>
    </bean>
相關文章
相關標籤/搜索