Spring框架:接口,了解bean的作用域,spring容器,setter注入,自動裝配【詩書畫唱】
概括:
舉例
個人對Spring好處的理解和修改部分?jǐn)?shù)據(jù)后要跟著改的內(nèi)容
個人注意事項(xiàng)記錄?
告訴你什么是setter注入(引用注入)
把這些關(guān)聯(lián)大的關(guān)系稱為“耦合”。spring框架的使用的作用之一為“松耦合”。
contains包含
spring容器中常用的方法。
bean的作用域
自動裝配
自動裝配可以減少原先要寫配置文件的代碼
3、SPRINGCORE框架_Spring容器.ppt
4、SPRINGCORE框架_了解Bean.ppt
使用setter注入,byName自動裝配等方法調(diào)用類的方法的代碼例子
public interface Track?
個人理解:setter注入和構(gòu)造器注入等都有不同的類型,比如值注入,引用注入等等



舉例
個人對Spring好處的理解和修改部分?jǐn)?shù)據(jù)后要跟著改的內(nèi)容:
其實(shí)如果要去引入和使用導(dǎo)入別人寫的Spring項(xiàng)目的話,需要修改的文件有:配置文件等等。有時自己可以修改下包名等,之后配置文件也對應(yīng)地修改。其實(shí)修改內(nèi)容時,基本只要注意配置文件的設(shè)置等等。這些就是我理解的Spring框架的好處之一。

其實(shí)如果要去引入和使用導(dǎo)入別人寫的Spring項(xiàng)目的話,需要修改的文件有:配置文件等等。有時自己可以修改下包名等,之后配置文件也對應(yīng)地修改。其實(shí)修改內(nèi)容時,基本只要注意配置文件的設(shè)置等等。這些就是我理解的Spring框架的好處之一。

個人注意事項(xiàng)記錄?
告訴你什么是setter注入(引用注入)








把這些關(guān)聯(lián)大的關(guān)系稱為“耦合”。spring框架的使用的作用之一為“松耦合”。

contains包含



spring容器中常用的方法。







bean的作用域




自動裝配。








使用setter注入,byName自動裝配等方法調(diào)用類的方法的代碼例子 START

package com.SSHC.bean;
public class Bike implements Track {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("踩踏運(yùn)載(打印出這句話說明成功調(diào)用"
+ "Bike類中的run()方法)");
}
? ??
}

package com.SSHC.bean;
public class Car implements Track{
@Override
? ? public void run(){
? ? System.out.println("四輪運(yùn)載,打印出這句話,說明調(diào)用了"
? ? + "Track類中的run方法");
? ? }
}

package com.SSHC.bean;
public class Cat {
? ? private String name;
? ? private Integer age;
? ??
? ? public Cat(){
? ?
? ? }
? ? public Cat(String n,Integer a) {
? ? this.name = n;
? ? this.age = a;
? ? }
? ??
? ? public void play(){
? ? System.out.println("正在玩耍,Cat類中含有的abc方法"
? ? + "\n 因?yàn)閐efault-init-method被調(diào)用了\n \n ");
? ? }
? ??
? ? public void abc(){
? ? System.out.println("初始貓開始...,Cat類中含有的abc方法"
? ? + "\n 因?yàn)閐efault-init-method被調(diào)用了\n \n ");
? ? }
}

package com.SSHC.bean;
public class Dog {
? ? private String name;
? ? private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "名字是:" + this.name + ",年齡是:" + this.age;
}
? ??
}

package com.SSHC.bean;
public class Person {
? ? private String name;//值類型
? ? private Cat pet;//引用類型
? ??
? ? public Person(String n,Cat c){
? ? this.name = n;
? ? this.pet = c;
? ? }
? ? public void guanging(){
? ? this.pet.play();
? ? }
? ? public void abc(){
? ? System.out.println("初始化人開始...Person類中含有的abc方法"
? ? + "\n 因?yàn)閐efault-init-method被調(diào)用了\n \n ");
? ? }
}

package com.SSHC.bean;
public class Plane implements Track {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("空中運(yùn)載");
}
}

package com.SSHC.bean;
public class ProductDao {
? ? public void add(){
? ? System.out.println("ProductDao中的add新增方法被調(diào)用了!");
? ? }
}

package com.SSHC.bean;
public class Student {
? ? private String name;//值
? ? private Dog dog;//引用
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void play(){
System.out.println("正在跟" +
this.dog.getName() + "玩耍,"
+ "\n 調(diào)用了Student類中的play方法"
+ "\n");
}
}

package com.SSHC.bean;
//交通工具接口
public interface Track {
//交通工具的運(yùn)載方式
? ? void run();
}

package com.SSHC.bean;
public class UserDao {
? ? public void selectAll(){
? ? System.out.println("查詢所有,調(diào)用了UserDao中的selectAll方法");
? ? }
}

package com.SSHC.bean;
public class UserService {
private UserDao userDao;
private ProductDao productDao;
private Person p;
? ? public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void setP(Person p) {
this.p = p;
}
public void loadData(){
? ? userDao.selectAll();
? ? productDao.add();
? ? p.guanging();
? ? }
}

package MainText;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Cat;
import com.SSHC.bean.Dog;
import com.SSHC.bean.Person;
import com.SSHC.bean.Student;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//new關(guān)鍵字不要出現(xiàn)在代碼中
? ? ? ? //Cat c = new Cat();
? ? ? ? //Cat c1 = new Cat("大黃",1);
? ? ? ? //獲取spring容器
ApplicationContext ctx = new?
ClassPathXmlApplicationContext("applicationContext.xml");
while(true){
/*配置文件中beans標(biāo)簽中
* 設(shè)置了 default-init-method="abc"
* ,那么針對全部bean,如果有abc的方法,
* 創(chuàng)建這個bean時就會調(diào)用一次這個方法。*/
System.out.print("請選擇操作:"
+ "1.setter注入,Dog測試(配置文件中設(shè)置了value值) "
+ ",2.setter注入,Student測試,"
+ "\n 3.用Spring框架調(diào)用Cat中的方法,"
+ "4.用Spring框架調(diào)用Person中的方法,"
+ "\n"
+ "5.打印ctx.getType(XXX)方法");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
if(num==1){
// Dog d = new Dog();
// d.setName("詩書畫唱養(yǎng)的的狗狗");
// d.setAge(6);
Dog d = (Dog) ctx.getBean("d");
System.out.println(d);
}
if(num==2){
// Student s = new Student();
// s.setName("小華");
// s.setDog(d);
Student s = (Student) ctx.getBean("s");
s.play();
}
if(num==3){
Cat c1 = (Cat) ctx.getBean("c1");
c1.play();
}
if(num==4){
// //Person p = new Person("小明",c1);
Person p = (Person) ctx.getBean("p");
p.guanging();
}
if(num==5){
System.out.println(ctx.getType("s"));}
}
}
}

package MainText;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Cat;
import com.SSHC.bean.Dog;
import com.SSHC.bean.Person;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//new關(guān)鍵字不要出現(xiàn)在代碼中
? ? ? ? //Cat c = new Cat();
? ? ? ? //Cat c1 = new Cat("大黃",1);
? ? ? ? //獲取spring容器
ApplicationContext ctx = new?
ClassPathXmlApplicationContext("applicationContext.xml");
Cat c1 = (Cat) ctx.getBean("c1");
c1.play();
// //Person p = new Person("小明",c1);
Person p = (Person) ctx.getBean("p");
p.guanging();
// Dog d = new Dog();
// d.setName("旺旺");
// d.setAge(2);
}
}

package MainText;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.SSHC.bean.Bike;
import com.SSHC.bean.Car;
import com.SSHC.bean.Cat;
import com.SSHC.bean.Track;
import com.SSHC.bean.UserService;
public class Test {
public static void main(String[] args) {
while(true){
System.out.print("請選擇操作:"
+ "1.使用Spring框架后不使用的new,"
+ "\n"
+ "import關(guān)鍵字的調(diào)用Bike,Cat類中的方法"
+ ",\n 2.Spring框架調(diào)用plane中的run方法"
+ "\n 3.使用containsBean判斷applicationContext.xml文件"
+ "中\(zhòng)n是否包含id值為c1的bean標(biāo)簽的部分,"
+ "\n打印true就說明存在,false就是不存在,"
+ " "
+ "\n 4.使用Spring框架中的byName的自動裝配"
+ "\n 來調(diào)用userService中的方法"
+ "\n");
? ?Scanner input = new Scanner(System.in);
? ?int num = input.nextInt();
if(num==1){
? ? ? ? Bike b = new Bike();
? ? ? ? b.run();
? ? ? ??
? ? ? ? Car c = new Car();
? ? ? ? c.run();
}
if(num==2){
ApplicationContext ctx = new?
ClassPathXmlApplicationContext("applicationContext.xml");
Track t = (Track) ctx.getBean("track");
/*配置文件中
?* <bean id="track"?
?* class="com.SSHC.bean.Plane"></bean>
?* 所以,調(diào)用的是plane中的run方法*/
t.run();
}
if(num==3){
ApplicationContext ctx = new?
ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ctx.containsBean("c1"));
//contains:包含
}
if(num==4){
ApplicationContext ctx = new?
ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService =?
(UserService) ctx.getBean("userService");
userService.loadData();
}}}
}

<?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:mvc="http://www.springframework.org/schema/mvc"
? ? xmlns:tx="http://www.springframework.org/schema/tx"
? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
? ? ? ? http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
? ? ? ? http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
? ? ? ? http://www.springframework.org/schema/tx?
? ? ? ? http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"
? ? ? ? default-init-method="abc">
? ?<bean id="c" class="com.SSHC.bean.Cat"></bean>?
? ?<bean id="c1" class="com.SSHC.bean.Cat" scope="prototype">
? ? ? ?<constructor-arg value="大黃"></constructor-arg>
? ? ? ?<constructor-arg value="1"></constructor-arg>
? ?</bean>
? ?<bean id="p" class="com.SSHC.bean.Person">
? ? ? ?<constructor-arg value="小明"></constructor-arg>
? ? ? ?<constructor-arg ref="c1"></constructor-arg>
? ?</bean>
? ?<bean id="d" class="com.SSHC.bean.Dog">
? ? ? ?<property name="name" value="詩書畫唱養(yǎng)的的狗狗"></property>
? ? ? ?<property name="age" value="2"></property>
? ?</bean>
? ?<bean id="s" class="com.SSHC.bean.Student">
? ? ? ?<property name="name" value="小華"></property>
? ? ? ?<property name="dog" ref="d"></property>
? ?</bean>
? ?
? ?<bean id="track" class="com.SSHC.bean.Plane"></bean>
? ?
? ?<bean id="userDao" class="com.SSHC.bean.UserDao"></bean>
? ?<bean id="productDao" class="com.SSHC.bean.ProductDao"></bean>
? ?<bean id="userService" class="com.SSHC.bean.UserService"
? ? ? ?autowire="byName">
? ? ? ?<!-- 在進(jìn)行setter注入時,如果name和ref相同,那么就可以進(jìn)行byName自動裝備 -->
? ? ? ?<!-- <property name="userDao" ref="userDao"></property> -->
? ?</bean>
</beans>

在bean包中的實(shí)體類(比如Bike類)的話就是會聲明一個方法(比如Bike類中的run的方法,方法
聲明了一個打引語句,打印成功,聲明調(diào)用這個方法成功了)
。以前調(diào)用這個方法的話,就要在含main方法中的class中new出這個方法所在位置的class的類,這樣
的話就還要,使用import關(guān)鍵導(dǎo)入這個類的包。
但是使用了Spring框架的話,就是只要在applicationContext.xml這個應(yīng)用上下文(這個名字寫出了Spring類似
框架連接的橋梁的作用)的xml配置文件中
使用bean標(biāo)簽,設(shè)置其中的項(xiàng)目中唯一值的id等等。
之后用代碼獲取這個applicationContext.xml
代碼運(yùn)行結(jié)果和說明:






使用setter注入,byName自動裝配等方法調(diào)用類的方法的代碼例子
END
3、SPRINGCORE框架_Spring容器.ppt START





SPRINGCORE框架
Spring容器
Spring上下文(一)
? ? Spring容器最基本的接口就是BeanFactory。該類負(fù)責(zé)配置、創(chuàng)建和管理Bean,它有一個名為applicationContext的子接口,稱為Spring上下文。? ? BeanFactory包含如下的幾種方法:
Spring上下文(二)
? ? ?ApplicationContext是BeanFactory的一個子接口,在一般的JAVA應(yīng)用程序中,常用的實(shí)現(xiàn)類有以下幾種:1、FileSystemXmlApplicationContext2、ClassPathXmlApplicationContext3、AnnotationConfigApplicationContext? ? ? 另外,如果需要在web開發(fā)中使用Spring容器,則需要使用以下的幾種實(shí)現(xiàn)類:1、XmlWebApplicationContext2、AnnotationConfigWebApplicationContext
Java應(yīng)用程序中的Spring容器
? ? ? ?對于獨(dú)立的Java應(yīng)用程序,必須提供Spring容器管理的Bean的詳細(xì)配置信息,而Spring的配置信息通常采用XML文件來進(jìn)行管理,因此可以通過BeanFactory的實(shí)現(xiàn)類XmlBeanFactory來實(shí)例化BeanFactory,而XML文件將被作為參數(shù)傳入。XML配置文件通常使用Resource對象傳入。? ? ? 1、創(chuàng)建一個非web工程,導(dǎo)入spring相關(guān)包。? ? ? 2、在工程根目錄下創(chuàng)建文件bean.xml。? ? ? 3、創(chuàng)建類DemoBean及其方法sayHi,該方法負(fù)責(zé)打印hi? ? ? 4、創(chuàng)建測試類Test,包含main方法。
JavaWeb程序中的Spring容器
? ? ? ?對于JavaWeb程序,對XML文件進(jìn)行解析的工作應(yīng)該在工程啟動時進(jìn)行,可以通過配置由Spring框架自帶的監(jiān)聽類ContextLoaderListener來實(shí)現(xiàn)。? ? ? 注意:這個監(jiān)聽類實(shí)際上也可以自己定義,但需要xml的某種解析模式以及反射技術(shù)的配合才可以完成。可通過查看org.springframework.web.context.ContextLoaderListener源碼進(jìn)行了解。
3、SPRINGCORE框架_Spring容器.ppt END
4、SPRINGCORE框架_了解Bean.ppt START











SPRINGCORE框架
了解Bean
Bean的基本定義(一)
在Spring的配置文件中,<beans>元素是作為根元素出現(xiàn)的,可以指定以下的屬性。
Bean的基本定義(二)
在Spring的配置文件中,<bean>元素是<beans>元素的子元素,每個<bean>元素都代表定義了一個類。<bean>元素可以指定以下的屬性
Bean的基本定義(三)
定義<bean>時,通常需要指定兩個屬性。1、id:確定Bean的唯一標(biāo)識符,容器對Bean管理、訪問以及指定Bean之間的依賴關(guān)系,都通過該屬性完成。在每個spring容器中,都是唯一的。2、class:指定Bean的具體實(shí)現(xiàn)類全路徑名。
設(shè)置BEAN的作用域
所有的Spring Bean默認(rèn)都是單例的,當(dāng)容器分配一個Bean時,無論是通過裝配還是調(diào)用容器的getBean方法,總是返回同一個Bean的實(shí)例,如果需要改變這種情況,可以通過設(shè)置bean的作用域scope屬性來覆蓋Bean的單例配置。
使用自動裝配注入Bean(一)
?Spring能自動裝配Bean與Bean之間的依賴關(guān)系,即無須使用ref顯式指定依賴的Bean。由BeanFactory檢查XML配置文件的內(nèi)容,根據(jù)某種規(guī)則,為主調(diào)Bean注入依賴關(guān)系。自動裝配可通過指定<beans>元素的default-autowire或者<bean>元素的autowire屬性指定。? ? ? 注意:自動裝配能夠減少配置文件的工作量,但是降低了依賴關(guān)系的透明性和清晰性。autowire屬性包含以下幾種值
使用自動裝配注入Bean(二)
創(chuàng)建如下的類:
使用自動裝配注入Bean(三)
byName:
1、查找class指定類中所有的set方法名,獲得將set去掉并且首字母小寫的字符串。
2、在Spring容器中尋找id為此字符串名稱的Bean對象。
3、如果有,就進(jìn)行注入;如果沒有,就報空指針異常。
使用自動裝配注入Bean(四)
byType:
首先需要保證:同一類型的對象,在spring容器中唯一。如果不唯一,會報不唯一的異常
使用自動裝配注入Bean(五)
1、創(chuàng)建UserDao類,創(chuàng)建PubService類,在PubService類中包含一個私有的UserDao類型的成員屬性以及setter。2、修改配置文件,通過pubService的autowire="byName"進(jìn)行自動裝配。3、修改配置文件 ,通過pubService的autowire="byType"進(jìn)行自動裝配。4、在PubService類中,添加一個構(gòu)造方法,該構(gòu)造方法包含一個UserDao類型的參數(shù)。5、修改配置文件,通過pubService的autowire="constructor"進(jìn)行自動裝配。注意:顯式的依賴注入將覆蓋自動裝配。