? Spring是一種非侵入式框架
飛侵入式
對(duì)現(xiàn)用功能沒(méi)有影響,能夠增強(qiáng)JavaBean的功能
松耦合
前面我們寫(xiě)程序的時(shí)候,都是面向接口編程,通過(guò)DaoFactory等方法實(shí)現(xiàn)松耦合。即減少模塊間的關(guān)聯(lián)性
Dao層和Service層通過(guò)DaoFacotry來(lái)實(shí)現(xiàn)松耦合,如果Service層直接new DaoBook(),那么Dao和Service層就是關(guān)聯(lián)性緊,即緊耦合。
在Spring層可以 private BookDao bookDao = DaoFacotry.getInstance().createDao("zhonggong.dao.impl.userDaoimp",OrderDao.class);? ? ?@Override? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @Permission("添加分類(lèi)")? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*添加分類(lèi)*/public void addCategory(Category category){cateGoryDao.addCategory(category);}
Spring中提供了IOC控制反轉(zhuǎn)來(lái)松弛模塊之間的關(guān)聯(lián)度。在采用面向?qū)ο笤O(shè)計(jì)的系統(tǒng)中,所有對(duì)象通過(guò)彼此的合作,最終通過(guò)系統(tǒng)的業(yè)務(wù)邏輯,即軟件系統(tǒng)中對(duì)象之間的互相合作來(lái)形成業(yè)務(wù)邏輯。而IOC是將復(fù)雜的系統(tǒng)分解為相互合作的關(guān)系.

把各個(gè)部分封裝之后,通過(guò)IOC容器來(lái)關(guān)聯(lián)這些對(duì)象。這稱(chēng)為控制反轉(zhuǎn),又叫依賴(lài)注入
切面編程也是AOP編程,動(dòng)鐵編程也是一種切面編程
動(dòng)態(tài)代理+注解的方法給Service添加權(quán)限
Controller調(diào)用Service的時(shí)候,Service返回的是一個(gè)代理對(duì)象。
代理對(duì)象得到Controller想要的方法的時(shí)候,通過(guò)反射來(lái)看該方法有沒(méi)有注解
如果有注解,就判斷該用戶(hù)是否有權(quán)限來(lái)調(diào)用改方法,沒(méi)有權(quán)限則拋出給controller,controlller得到?jīng)]有權(quán)限異常就可以對(duì)用戶(hù)進(jìn)行提示
AOP:在執(zhí)行某些代碼前,執(zhí)行另外的代碼
struct2的攔截器也是面向切面攔截
action:多個(gè),訪問(wèn)時(shí)創(chuàng)建,依賴(lài)service
service:一個(gè),不需要維護(hù)公共變量,啟動(dòng)時(shí)創(chuàng)建,依賴(lài)dao
dao:一個(gè),啟動(dòng)時(shí)創(chuàng)建
注釋?zhuān)篅Controller 數(shù)據(jù)經(jīng)過(guò)業(yè)務(wù)處理邏輯后封裝成一個(gè)model,然后再返回給View進(jìn)行展示
在SpringMVC中提供了一個(gè)簡(jiǎn)便的定義Controller的方法,你無(wú)需繼承特定的類(lèi)或者接口,只需要使用Controller 標(biāo)記一個(gè)controller?
@RequestMapping 注解,
作用域@Scope prototype request session global session
自動(dòng)裝配@Autowired
@Component:標(biāo)準(zhǔn)一個(gè)普通的spring Bean類(lèi)。
@Controller:標(biāo)注一個(gè)控制器組件類(lèi)。
@Service:標(biāo)注一個(gè)業(yè)務(wù)邏輯組件類(lèi)。
@Repository:標(biāo)注一個(gè)DAO組件類(lèi)。
@Runwith()是一個(gè)運(yùn)行器,括號(hào)里跟Unit4.class Suite.class
@ContextConfiguration Spring整合多個(gè)Utnit4測(cè)試的時(shí)候,使用注解引入多個(gè)配置文件
單個(gè)文件:
@ContextC2? ? ? ? ? ? onfigruation(Locations="classpath:applicationContext.xml)
@ContextConfiguration(locations = { "classpath:spring1.xml", "classpath:spring2.xml" })?
@Configuration把一個(gè)類(lèi)作為一個(gè)IoC容器,它的某個(gè)方法頭上如果注冊(cè)了@Bean,就會(huì)作為這個(gè)Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延遲初始化
@Service用于標(biāo)注業(yè)務(wù)層組件、?
@Controller用于標(biāo)注控制層組件(如struts中的action)
@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件。
@Component泛指組件,當(dāng)組件不好歸類(lèi)的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。
@Scope用于指定scope作用域的(用在類(lèi)上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定銷(xiāo)毀方法(用在方法上)
@DependsOn:定義Bean初始化及銷(xiāo)毀時(shí)的順序
@Primary:自動(dòng)裝配時(shí)當(dāng)出現(xiàn)多個(gè)Bean候選者時(shí),被注解為@Primary的Bean將作為首選者,否則將拋出異常
@Autowired 默認(rèn)按類(lèi)型裝配,如果我們想使用按名稱(chēng)裝配,可以結(jié)合@Qualifier注解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多個(gè)實(shí)例配合使用
@Resource默認(rèn)按名稱(chēng)裝配,當(dāng)找不到與名稱(chēng)匹配的bean才會(huì)按類(lèi)型裝配。
@PostConstruct 初始化注解
@PreDestroy 摧毀注解 默認(rèn) 單例? 啟動(dòng)就加載
@Async異步方法調(diào)用
bean.xml:<context:compnent-scan base-package="com.kn.beanScope">
@Component//標(biāo)注這是一個(gè)普通的BEAN文件
public void sout(){
? ? ? ? ? ? ?System.out.println("????THIS is OH Data!");
}


BeanScope.java,中scope設(shè)定定義域,每次新建自身實(shí)例
@Component
@Scope("prototype")
public class BeanScope(){
? ? ? @Autowired
? ? ? private OH oh;
? ? ? private String beanname;
}
UserAxeTest
?ApplicationContext ctx = new ClassPathXmlApplication("bean_zj.xml");
BeanScope beanscope = ctx.getBean("beanscope",BeanScope.class);
beanScope.init();
BeanScope.beanscope1=ctx.getBean("beanScope",BeanScope.class);

獲取兩次 beanScope 然后 第一次先調(diào)用init 再say,第二次 直接say
Spring的Datasource多循環(huán)問(wèn)題:1、準(zhǔn)備依賴(lài) 2.token從以前的數(shù)據(jù)庫(kù)移除了,移到了redis端
maven repository:maven中央倉(cāng)庫(kù)
? 鏈接打開(kāi)后如下:
? 那么怎么使用這個(gè)網(wǎng)站呢?
? 舉例,我需要寫(xiě)一個(gè)java發(fā)送郵件的功能,需要java.mail的jar包。那么我直接在搜索框中輸入:mail,搜索結(jié)果如下:
? 如圖,我們看到了前兩個(gè)選項(xiàng):JavaMail API JAR和JavaMail API(compat)。
? 按照慣例選擇usages最多的那個(gè),也就是javaMail API(compat),點(diǎn)擊打開(kāi)。
? 然后在下面的version里面選一個(gè),比如1.4.7。
? 將下面的xml代碼復(fù)制到你的pom.xml中即可。
Spring Web Spring對(duì)web模塊的支持。
? ? ? ? ? ? ? ? 可以與struts整合,讓struts的action創(chuàng)建交給spring
? ? ? ? ? ? ? ? spring mvc模式
Spring DAO Spring 對(duì)jdbc操作的支持 【JdbcTemplate模板工具類(lèi)】
Spring ORM spring對(duì)orm的支持:
既可以與hibernate整合,【session】
也可以使用spring的對(duì)hibernate操作的封裝
Spring AOP 切面編程
SpringEE spring 對(duì)javaEE其他模塊的支持
依賴(lài)注入:甲方開(kāi)放接口時(shí),乙方可以傳遞進(jìn)來(lái)控制反轉(zhuǎn),
甲乙雙方不相互依賴(lài),交易活動(dòng)時(shí)不依賴(lài)甲乙任何一方,整個(gè)活動(dòng)不依賴(lài)甲乙任何一方,整個(gè)活動(dòng)由第三方解決
單例的好處:效率高,不浪費(fèi)空間。方便單元測(cè)試,方便切換mock組件,方便于AOP操作,對(duì)于操作是透明的,統(tǒng)一配置,便于修改
Spring可以分成六大模塊:spring core spring的核心,IOC:容器,解決對(duì)象創(chuàng)建以及依賴(lài)問(wèn)題
spring web spring對(duì)web模塊的支持,可以和struct融合,把struct的action交給Spring來(lái)創(chuàng)建
spring MVC模式,spring DAO spring對(duì)orm的支持,也可以和hibenate整合,也可以使用spring對(duì)hibernate操作的封裝
Spring AOP的切面操作
SpringEE spring對(duì)JAVAEE其他模塊的支持:Core模塊快速入門(mén)
引入jar包:
本博文主要是core模塊的內(nèi)容,涉及到Spring core的開(kāi)發(fā)jar包有五個(gè):
commons-logging-1.1.3.jar 日志
spring-beans-3.2.5.RELEASE.jar bean節(jié)點(diǎn)
spring-context-3.2.5.RELEASE.jar spring上下文節(jié)點(diǎn)
spring-core-3.2.5.RELEASE.jar spring核心功能
spring-expression-3.2.5.RELEASE.jar spring表達(dá)式相關(guān)表
Spring的核心配置文件是ApplicationContext.xml或者叫bean.xml,
core容器是ICO容器,能解決對(duì)象創(chuàng)建之間的依賴(lài)關(guān)系,IOC細(xì)節(jié)
得到Spring容器對(duì)象,IOC容器.000000
Spring容器不單單只是一個(gè),可以歸類(lèi)為兩種類(lèi)型
Bean工廠,BeanFactory ( 功能簡(jiǎn)單)\
應(yīng)用上下文,ApplicationContext(功能強(qiáng)大,一般我們使用這個(gè))
通過(guò)Resource獲得BeanFactory
加載Spring配置文件來(lái)創(chuàng)建IOC容器
類(lèi)路徑下XML獲取ApplicationContext
直接通過(guò)ClassPathApplicationContext對(duì)象來(lái)獲取
//得到IOC容器對(duì)象,ApplicationContext ac
=newClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ac;)
Spring中總可以通過(guò)三種方法來(lái)配置對(duì)象
使用XML來(lái)配置,使用注解來(lái)配置,使用JavaConfig來(lái)配置

