摘要:簡(jiǎn)單來說,是一個(gè)輕量級(jí)的控制反轉(zhuǎn)和面向切面的容器框架。變成的支持提供面向切面編程,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截,運(yùn)行監(jiān)控等功能。用于反射創(chuàng)建對(duì)象,默認(rèn)情況下調(diào)用無參構(gòu)造函數(shù)。指定對(duì)象的作用范圍。
1.Spring介紹 1.1 Spring概述
Spring是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開發(fā)框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務(wù)器端的開發(fā)。從簡(jiǎn)單性、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。簡(jiǎn)單來說,Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
1.2 Spring好處
方便解耦,簡(jiǎn)化開發(fā)
Spring就是一個(gè)大工廠,專門負(fù)責(zé)生成Bean,可以將所有對(duì)象創(chuàng)建和依賴關(guān)系維護(hù)由Spring管理。通過Spring提供的IoC容器,可以將對(duì)象間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用。
AOP變成的支持
Spring提供面向切面編程,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截,運(yùn)行監(jiān)控等功能。通過Spring的AOP功能,方便進(jìn)行面向切面的編程,許多不容易用傳統(tǒng)OOP實(shí)現(xiàn)的功能可以通過AOP輕松應(yīng)付。
聲明式事務(wù)的支持
只需要通過配置就可以完成對(duì)事務(wù)的管理,而無需手動(dòng)編程
方便程序的測(cè)試
Spring對(duì)Junit4支持,可以通過注解方便的測(cè)試Spring程序
方便集成各種優(yōu)秀框架
Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對(duì)各種優(yōu)秀框架的支持,如Struts、Hibernate、Mybatis、Quartz等
降低JavaEE API的使用難度
對(duì)JavaEE開發(fā)中一些難用的API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝,使這些API應(yīng)用難度大大降低
Java源碼是經(jīng)典學(xué)習(xí)范例
Spring的源代碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對(duì)Java設(shè)計(jì)模式靈活運(yùn)用以及對(duì)Java技術(shù)的高深造詣。它的源代碼無意是Java技術(shù)的最佳實(shí)踐的范例。
1.3 Spring結(jié)構(gòu)體系Spring框架是一個(gè)分層架構(gòu),它包含一系列的功能要素并被分為大約20個(gè)模塊。這些模塊分為Core Container、DataAccess/Integration、Web、AOP、Instrumentation和測(cè)試部分。如下圖所示:
1.4 在項(xiàng)目中的架構(gòu)web層:Struts,SpringMVC
dao層:Hibernate,Mybatis
1.5 程序的耦合和解耦
程序的耦合
我們開發(fā)種,會(huì)寫很多的類,而有些類之間不可避免地產(chǎn)生依賴關(guān)系,這種依賴關(guān)系稱為耦合。有些依賴是必須的,有些依賴關(guān)系可以通過優(yōu)化代碼來解除。比如:
/** * 客戶的業(yè)務(wù)層實(shí)現(xiàn)類 */ public class CustomerServiceImpl implements ICustomerService { private ICustomerDao customerDao = new CustomerDaoImpl(); }
上面的代碼表示:業(yè)務(wù)調(diào)用持久層,并且此時(shí)業(yè)務(wù)再依賴持久層的接口和實(shí)現(xiàn)類。如果此時(shí)沒有持久層實(shí)現(xiàn)類,編譯將不能通過。這種依賴關(guān)系就是我們可以通過優(yōu)化代碼解決的。
再比如:下面的代碼種,我們的類依賴MySQL的具體驅(qū)動(dòng)類,如果這獅虎更換了數(shù)據(jù)庫(kù)品牌,我們需要改源碼來修修改數(shù)據(jù)庫(kù)驅(qū)動(dòng),這顯然不是我們想要的。
public class JdbcDemo1 { /** * JDBC操作數(shù)據(jù)庫(kù)的基本入門中存在什么問題? * 導(dǎo)致驅(qū)動(dòng)注冊(cè)兩次是個(gè)問題,但不是嚴(yán)重的。 * 嚴(yán)重的問題:是當(dāng)前類和mysql的驅(qū)動(dòng)類有很強(qiáng)的依賴關(guān)系。 * 當(dāng)我們沒有驅(qū)動(dòng)類的時(shí)候,連編譯都不讓。 * 那這種依賴關(guān)系,就叫做程序的耦合 * * 我們?cè)陂_發(fā)中,理想的狀態(tài)應(yīng)該是: * 我們應(yīng)該盡力達(dá)到的:編譯時(shí)不依賴,運(yùn)行時(shí)才依賴。 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //1.注冊(cè)驅(qū)動(dòng) //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.獲取連接 //3.獲取預(yù)處理sql語(yǔ)句對(duì)象 //4.獲取結(jié)果集 //5.遍歷結(jié)果集 }
解決程序耦合的思路
在JDBC種是通過反射來注冊(cè)驅(qū)動(dòng)的,代碼如下:
Clas.forName("com.mysql.jdbc.Driver");
這時(shí)的好處是,我們類中不再依賴具體的驅(qū)動(dòng)類,此時(shí)就算刪除MySQL的驅(qū)動(dòng)jar包,依然可以編譯。但是沒有驅(qū)動(dòng)類,所以不能運(yùn)行。
不過,此處也有一個(gè)問題,就是我們反射類對(duì)象的全限定類名字符串是在Java類中寫死的,一旦要改還是徐婭修改源碼。為了解決這個(gè)問題,使用配置文件配置。
工廠模式解耦
在實(shí)際開發(fā)過程總我們把所有的dao和service和action對(duì)象使用配置文件配置起來,當(dāng)啟動(dòng)服務(wù)器應(yīng)用加載的時(shí)候,通過讀取配置文件,把這些對(duì)象創(chuàng)建出來并存起來。在接下來使用的時(shí)候,直接拿就好了。
控制反轉(zhuǎn)---Inversion Of Control
上面解耦的思路有兩個(gè)問題
創(chuàng)建的對(duì)象存儲(chǔ)在哪里?由于我們是很多對(duì)象,肯定要找個(gè)集合來存儲(chǔ),這時(shí)候有Map和List供選擇。到底是選擇Map還是List就看我們有沒有查找的需求。有查找的需求就選Map。所以我們的答案是:在應(yīng)用加載時(shí),創(chuàng)建一個(gè)Map,用于存放action,service和dao對(duì)象。
還是沒解釋什么是工廠?工廠就是負(fù)責(zé)給我們從容器中獲取指定對(duì)象的類。這時(shí)候獲取對(duì)象的方式發(fā)生了改變。以前,我們?cè)讷@取對(duì)象的時(shí)候,都是采用new的方式,是主動(dòng)的。
現(xiàn)在,我么獲取對(duì)象的時(shí)候,同時(shí)跟工廠要,有工廠為我們查找或者創(chuàng)建對(duì)象。是被動(dòng)的。這種被動(dòng)接收的方式獲取對(duì)象的思想就是控制反轉(zhuǎn),他是Spring框架的核心之一。其作用只有一個(gè):降低計(jì)算機(jī)程序的耦合。
2. Spring快速入門使用spring的IOC解決程序耦合
2.1 編寫流程下載Spring開發(fā)包
導(dǎo)入Spring的jar包
配置Spring的核心xml文件
在程序中讀取Spring的配置文件來獲取Bean【Bean其實(shí)就是一個(gè)new好的對(duì)象】
2.2 下載地址這里下載4.2.4版本
地址:http://repo.spring.io/release...
官網(wǎng):spring.io 官網(wǎng)改版后,下載鏈接需要在對(duì)應(yīng)的GitHub上找
2.3 Spring的核心jar包spring-core-4.2.4.RELEASE.jar包含Spring框架基本的核心工具類,Spring其他組件都要使用到這個(gè)包里得嘞,是其他組件的基本核心。
spring-beans-4.2.4.RELEASE.jar所有應(yīng)用都要用到的,它包含訪問配置文件、創(chuàng)建和管理bean
以及進(jìn)行Inversion of Control(IoC) / Dependency Injection(DI)操作相關(guān)的所有類。
spring-context-4.2.4.RELEASE.jarSpring提供在基礎(chǔ)IoC功能上的擴(kuò)展服務(wù),此外還提供許多企業(yè)級(jí)服務(wù)的支持,
如郵件服務(wù)、任務(wù)調(diào)度、JNDI定位、EJB集成、遠(yuǎn)程訪問、緩存以及各種視圖層框架的封裝等。
spring-expression-4.2.4.RELEASE.jarSpring表達(dá)式語(yǔ)言。
com.springsource.org.apache.commons.logging-1.1.1.jar第三方的主要用于處理日志。
2.4 Spring入門案例
準(zhǔn)備項(xiàng)目需要得jar包
spring-framework-4.2.4.RELEASE-dist.zip 【Spring的核心包】
spring-framework-4.2.4.RELEASE-dependencies.zip 【Spring的依賴包】
創(chuàng)建Project,導(dǎo)入Spring的jar包
在src路徑下創(chuàng)建applicationContext.xml文件
導(dǎo)入約束
把資源交給Spring管理,在xml文件中配置User
測(cè)試
package com.itzhouq.domain; public class User { public void run() { System.out.println("run"); } }
package com.itzhouq.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itzhouq.domain.User; public class UserTeset { @Test public void test() {//自己new的對(duì)象 User user = new User(); user.run(); } @Test public void test2() {//spring的ioc創(chuàng)建對(duì)象 //加載配置文件 src/classes類路徑 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //找Spring要對(duì)象 User user = (User) context.getBean("user"); user.run(); } }3. Spring基于XML的IOC細(xì)節(jié) 3.1 IOC中bean標(biāo)簽和管理對(duì)象細(xì)節(jié) 3.1.1 配置文件bean標(biāo)簽
作用
用于配置對(duì)象讓Spring來創(chuàng)建的。默認(rèn)情況下它調(diào)用的是類中的無參構(gòu)造函數(shù)。如果沒有無參構(gòu)造函數(shù)則不能創(chuàng)建成功。
屬性
id:給對(duì)象在容器中提供一個(gè)唯一標(biāo)識(shí),用于獲取對(duì)象
class:指定類的全限定名。用于反射創(chuàng)建對(duì)象,默認(rèn)情況下調(diào)用無參構(gòu)造函數(shù)。
scope:指定對(duì)象的作用范圍。
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷毀方法名稱。
import:導(dǎo)入外部配置文件,resource----外部配置文件的地址。
3.1.2 scope屬性:范圍(重點(diǎn))singleton: 單實(shí)例 默認(rèn)值
如果是單實(shí)例,配置文件文件只要一加載 就會(huì)創(chuàng)建對(duì)象 放在spring容器 (map
當(dāng)所有人過來問spring容器要的時(shí)候(getBean),所用人用的都是同一個(gè)對(duì)象
prototype: 多實(shí)例
如果是多實(shí)例,配置文件加載,不創(chuàng)建對(duì)象
當(dāng)每個(gè)人過來getbean的時(shí)候,getbean一次創(chuàng)建一次 放在容器中
什么時(shí)候用默認(rèn)值singleton(單實(shí)例)? 什么時(shí)候用prototype(多實(shí)例)?
action: prototype
service/dao: singleton
request:web項(xiàng)目中Spring創(chuàng)建一個(gè)Bean對(duì)象,將對(duì)象存入到request域中
session:web項(xiàng)目中Spring創(chuàng)建一個(gè)Bean對(duì)象,將對(duì)象存入到session域中。
globalSession:web項(xiàng)目中,應(yīng)用在Portlet環(huán)境,如果沒有Portlet環(huán)境那么globalSession相當(dāng)于session。
3.1.3 bean的作用范圍和生命周期
單例對(duì)象:scope="singleton"
一個(gè)應(yīng)用只有一個(gè)對(duì)象的實(shí)例。它的作用范圍就是整個(gè)引用。
生命周期:
對(duì)象出生:當(dāng)應(yīng)用加載,創(chuàng)建容器時(shí),對(duì)象就被創(chuàng)建了。
對(duì)象活著:只要容器在,對(duì)象一直活著。
對(duì)象死亡:當(dāng)應(yīng)用卸載,銷毀容器時(shí),對(duì)象就被銷毀了。
多例對(duì)象:scope="prototype"
每次訪問對(duì)象時(shí),都會(huì)重新創(chuàng)建對(duì)象實(shí)例。
生命周期:
對(duì)象出生:當(dāng)使用對(duì)象時(shí),創(chuàng)建新的對(duì)象實(shí)例。
對(duì)象活著:只要對(duì)象在使用中,就一直活著。
對(duì)象死亡:當(dāng)對(duì)象長(zhǎng)時(shí)間不用時(shí),被java的垃圾回收器回收了。
3.1.4 示例化Bean的三種方式
無參構(gòu)造方式(最常用)
@Test//測(cè)試bean的三種創(chuàng)建方式------無參構(gòu)造方式 public void test3() { //加載配置文件 src/classes類路徑 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //找Spring要對(duì)象 User user = (User) context.getBean("user"); user.run(); }
靜態(tài)工廠方式(了解)
條件:需要有一個(gè)工廠類,在這個(gè)工廠類中還需要一個(gè)靜態(tài)方法
package com.itzhouq.utils; import com.itzhouq.domain.User; public class BeanFactory { public static User createUser() { return new User(); } }
測(cè)試
@Test//測(cè)試bean的三種創(chuàng)建方式------靜態(tài)工廠方式 public void test4() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user1 = (User) context.getBean("user"); System.out.println(user1);//com.itzhouq.domain.User@5f3a4b84 User user2 = (User) context.getBean("user"); System.out.println(user2);//com.itzhouq.domain.User@5f3a4b84 }
實(shí)例工廠方式(了解)
條件:需要一個(gè)工廠類在這個(gè)工廠類中需要一個(gè)普通方法
package com.itzhouq.utils; import com.itzhouq.domain.User; public class BeanFactory { // public static User createUser() { // return new User(); // } //普通方法----實(shí)例工廠 public User createUser() { return new User(); } }
配置文件
測(cè)試
@Test//測(cè)試bean的三種創(chuàng)建方式------實(shí)例工廠方式 public void test5() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user1 = (User) context.getBean("user"); System.out.println(user1);//com.itzhouq.domain.User@5f3a4b84 User user2 = (User) context.getBean("user"); System.out.println(user2);//com.itzhouq.domain.User@5f3a4b84 }3.2 加載Spring容器的三種方式
類路徑獲得配置文件
文件系統(tǒng)路徑獲得配置文件
使用BeanFactory(了解)
public class Lession01 { @Test public void test01(){ //Spring容器加載有3種方式 //第一種:ClassPathXmlApplicationContext ClassPath類路徑加載:指的就是classes路徑 //最常用,Spring的配置文件以后就放在src路徑下 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //第二種方式:文件系統(tǒng)路徑獲得配置文件【絕對(duì)路徑】 ApplicationContext context = new FileSystemXmlApplicationContext("E:workspacesIdeaProjectSpring-day02-gyfsrceans.xml"); IUserService user = (IUserService) context.getBean("userService"); user.add(); //第三種方式: String path = "E:workspacesIdeaProjectSpring-day02-gyfsrceans.xml"; BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path)); IUserService user1 = (IUserService) factory.getBean("userService"); user1.add(); } }
Spring內(nèi)部創(chuàng)建對(duì)象的原理
1. 解析xml文件,獲得類名,id,屬性 2. 通過反射,用類型創(chuàng)建對(duì)象 3. 給創(chuàng)建的對(duì)象賦值3.3 BeanFactory和ApplicationContext對(duì)比
BeanFactory采用延遲加載,第一次getBean時(shí)才會(huì)初始化Bean
ApplicationContext是對(duì)BeanFactory擴(kuò)展,提供了更多功能
國(guó)際化處理
事件傳遞
Bean自動(dòng)裝配
各種不同應(yīng)用的Context實(shí)現(xiàn)
3. 4 Spring的依賴注入DIDI屬性的依賴注入,是Spring框架核心IoC的具體實(shí)現(xiàn)方式。Spring在通過Ioc創(chuàng)建對(duì)象的時(shí)候,如果這個(gè)對(duì)象還有屬性,就一并賦值進(jìn)去,而不用我們自己去獲取。
入門舉例:
創(chuàng)建一個(gè)接口Car
package com.itzhouq.service; public interface Car { public void run(); }
創(chuàng)建實(shí)現(xiàn)類CarImpl
package com.itzhouq.serviceImpl; import com.itzhouq.service.Car; public class CarImpl implements Car { private String name; public void setName(String name) { this.name = name; } @Override public void run() { System.out.println(name+"車跑起來了....."); } }
測(cè)試
package com.itzhouq.test; import org.junit.Test; import com.itzhouq.serviceImpl.CarImpl; public class CarTest { @Test//自己new對(duì)象 自己屬性賦值的方式 public void test() { CarImpl car = new CarImpl(); car.setName("qq"); car.run();//qq車跑起來了..... } }
入門舉例2:依賴注入的方式
配置文件:
測(cè)試
@Test //Spring的IOC public void test2() { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Car car = (Car)context.getBean("car"); //把這個(gè)對(duì)象的屬性也在創(chuàng)建的時(shí)候給順便賦值了-----DI car.run();//蘭博基尼車跑起來了..... }
依賴注入的方式
構(gòu)造函數(shù)注入(了解)
set方法注入(掌握)
使用p名稱空間注入數(shù)據(jù)(本質(zhì)還是調(diào)用set方法)(了解)
注入集合屬性
3.4.1 構(gòu)造器注入方式條件:需要有有參構(gòu)造方法
給CarImpl設(shè)置有參構(gòu)造
package com.itzhouq.serviceImpl; import com.itzhouq.service.Car; public class CarImpl implements Car { private String name; private double price; public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getName() { return name; } public CarImpl() {} //有參的構(gòu)造方法----DI的構(gòu)造器注入方式 public CarImpl(String name, double price) { super(); this.name = name; this.price = price; } @Override public void run() { System.out.println("價(jià)值"+price+"的"+name+"車跑起來了....."); } }
配置文件
測(cè)試
@Test //Spring的DI注入方式----構(gòu)造器的注入方式(了解) public void test3() { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Car car = (Car)context.getBean("car"); car.run();//價(jià)值1000000.0的BMW車跑起來了..... }3.4.2 set方式注入
寫一個(gè)Person接口
package com.itzhouq.service; public interface Person { }
PersonImpl實(shí)現(xiàn)接口Person,設(shè)置set方法
package com.itzhouq.serviceImpl; import com.itzhouq.service.Car; import com.itzhouq.service.Person; public class PersonImpl implements Person { private String name; private Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "PersonImpl [name=" + name + ", car=" + car + "]"; } }
配置文件
測(cè)試
@Test //Spring的DI注入方式----set的注入方式(了解) public void test4() { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Person person = (Person) context.getBean("person"); System.out.println(person); //PersonImpl [name=jack, car=CarImpl [name=BMW, price=1000000.0]] }3.4.3 使用p名稱空間注入數(shù)據(jù)(知道就OK)
此種方式是通過在xml中導(dǎo)入p名稱空間,使用p:propertyName來注入數(shù)據(jù),它的本質(zhì)仍然是調(diào)用類中的set方法實(shí)現(xiàn)注入功能。
配置文件
3.4.4 注入集合屬性
顧名思義,就是給類中的集合成員傳值,它用的也是set方法注入的方式,只不過變量的數(shù)據(jù)類型都是集合。我們這里介紹注入數(shù)組,List,Set,Map,Properties。
創(chuàng)建一個(gè)類CollBean,設(shè)置set方法
package com.itzhouq.domain; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; public class CollBean { private String[] ss; private List ll; private Map mm; private Properties properties; public String[] getSs() { return ss; } public void setSs(String[] ss) { this.ss = ss; } public List getLl() { return ll; } public void setLl(List ll) { this.ll = ll; } public Map getMm() { return mm; } public void setMm(Map mm) { this.mm = mm; } public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } @Override public String toString() { return "CollBean [ss=" + Arrays.toString(ss) + ", ll=" + ll + ", mm=" + mm + ", properties=" + properties + "]"; } }
配置文件
aaa bbb ccc root 1234
測(cè)試
package com.itzhouq.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itzhouq.domain.CollBean; public class CollBeanTest { @Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); CollBean cb = (CollBean) context.getBean("collBean"); System.out.println(cb); /* * CollBean [ss=[aaa, bbb, ccc], * ll=[111, 222, CarImpl [name=BMW, price=1000000.0]], * mm={k1=AAA, k2=BBB, k3=CarImpl [name=BMW, price=1000000.0]}, * properties={hibernate.password=1234, hibernate.username=root}] */ } }4.使用案例
需求分析:從service層調(diào)用dao層,將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù),存儲(chǔ)數(shù)據(jù)的過程使用syso模擬一下就可以。
創(chuàng)建工程,導(dǎo)入需要的jar包,建包如下:
創(chuàng)建dao層和dao實(shí)現(xiàn)層
package com.itzhouq.dao; public interface UserDao { void save(); }
package com.itzhouq.daoImpl; import com.itzhouq.dao.UserDao; public class UserDaoImpl implements UserDao{ @Override public void save() { System.out.println("操作數(shù)據(jù)庫(kù),保存用戶的數(shù)據(jù)"); } }
創(chuàng)建Service層和實(shí)現(xiàn)層
package com.itzhouq.service; public interface UserService { public void save(); }
package com.itzhouq.serviceImpl; import com.itzhouq.dao.UserDao; import com.itzhouq.daoImpl.UserDaoImpl; import com.itzhouq.service.UserService; public class UserServiceImpl implements UserService { private String name; private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void setName(String name) { this.name = name; } @Override public void save() { System.out.println(name); //調(diào)用dao userDao.save(); } }
給UserDaoImpl一個(gè)UserDao屬性
配置文件
測(cè)試
@Test //使用Spring的IOC+DI來實(shí)現(xiàn)對(duì)象的創(chuàng)建和賦值 public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) context.getBean("UserService"); userService.save(); //要開始訪問dao了 //操作數(shù)據(jù)庫(kù),保存用戶的數(shù)據(jù) }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74363.html
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:現(xiàn)在的分片策略是上海深圳分別建庫(kù),每個(gè)庫(kù)都存各自交易所的兩支股票的,且按照月分表。五配置分片策略數(shù)據(jù)庫(kù)分片策略在這個(gè)實(shí)例中,數(shù)據(jù)庫(kù)的分庫(kù)就是根據(jù)上海和深圳來分的,在中是單鍵分片。 由于當(dāng)當(dāng)發(fā)布了最新的Sharding-Sphere,所以本文已經(jīng)過時(shí),不日將推出新的版本 項(xiàng)目中遇到了分庫(kù)分表的問題,找到了shrding-jdbc,于是就搞了一個(gè)springboot+sharding-jd...
摘要:項(xiàng)目介紹風(fēng)格的一套系統(tǒng),前端采用作為前端框架,后端采用作為服務(wù)框架,采用自封裝的對(duì)所有請(qǐng)求進(jìn)行參數(shù)校驗(yàn),以保證接口安全性。 skyeye 項(xiàng)目介紹 win10風(fēng)格的一套系統(tǒng),前端采用layui作為前端框架,后端采用SpringBoot作為服務(wù)框架,采用自封裝的xml對(duì)所有請(qǐng)求進(jìn)行參數(shù)校驗(yàn),以保證接口安全性。 項(xiàng)目地址:https://gitee.com/doc_wei01_a...該項(xiàng)...
摘要:時(shí)間年月日星期四說明本文部分內(nèi)容均來自慕課網(wǎng)。那么里面的數(shù)據(jù)就可以分為各種各樣的索引,比如汽車索引圖書索引家具索引等等。圖書索引又可以細(xì)分為各種類型,比如科普類小說類技術(shù)類等等。具體到每一本書籍,就是文檔,就是整個(gè)圖書里面最小的存儲(chǔ)單位。 時(shí)間:2017年09月14日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無學(xué)習(xí)源碼:https...
閱讀 1751·2023-04-25 23:43
閱讀 932·2021-11-24 09:39
閱讀 731·2021-11-22 15:25
閱讀 1729·2021-11-22 12:08
閱讀 1099·2021-11-18 10:07
閱讀 2083·2021-09-23 11:22
閱讀 3355·2021-09-22 15:23
閱讀 2513·2021-09-13 10:32