Spring筆記

Spring

控制反轉(zhuǎn)IOC

IoC Inverse of Control 反轉(zhuǎn)控制的概念,就是將原本在程序中手動(dòng)創(chuàng)建HelloService對(duì)象的控制權(quán),交由Spring框架管理,簡(jiǎn)單說,就是創(chuàng)建HelloService對(duì)象控制權(quán)被反轉(zhuǎn)到了Spring框架

BeanFactory,延遲實(shí)例化bean,第一次調(diào)用getBean
ApplicationContext 一般常用,功能更強(qiáng)
    ClassPathXmlApplicationContext 加載classpath xml文件
    FileSystemXmlApplicationContext 加載指定盤符文件 , ServletContext.getRealPath()

加載Spring容器

ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("cn/ccj/a/hello/beans.xml");
ClassPathXmlApplicationContext(String)加載一個(gè)spring容器
ClassPathXmlApplicationContext(String[])加載多個(gè)spring容器

Spring DI 設(shè)置字段內(nèi)容

DI:Dependency Injection 依賴注入,在Spring框架負(fù)責(zé)創(chuàng)建Bean對(duì)象時(shí)(控制反轉(zhuǎn)),動(dòng)態(tài)的將依賴對(duì)象注入到Bean組件。
getBean("helloService")從spring容器中獲得指定名稱對(duì)象的實(shí)例時(shí),通過此設(shè)置<property name="info" value="haha"></property> 相當(dāng)于執(zhí)行 servcie.setInfo("傳智播客");

<?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="helloService" class="cn.ccj.a.hello.HelloService">
        <!—通過spring容器,給HelloService類的info屬性注入“傳智播客”-->
        <property name="info" value="haha"></property>
    </bean>
</beans>

從spring直接獲得注入的內(nèi)容

package cn.ccj.a.hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestHello {
    
    public static void main(String[] args) {
        //使用spring 控制反轉(zhuǎn),交予spring創(chuàng)建對(duì)象
        ApplicationContext applicationContext = 
new ClassPathXmlApplicationContext("cn/ccj/a/hello/beans.xml");
        HelloService servcie = 
(HelloService) applicationContext.getBean("helloService");
        
        //servcie.setInfo("hello");
        servcie.sayInfo();
    }

}

2.Bean.xml的配置

類別說明

類別 說明
singleton 在Spring IoC容器中僅存在一個(gè)Bean實(shí)例,Bean以單例方式存在,默認(rèn)值
prototype 每次從容器中調(diào)用Bean時(shí),都返回一個(gè)新的實(shí)例,即每次調(diào)用getBean()時(shí) ,相當(dāng)于執(zhí)行new XxxBean()
request 每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用域僅適用于WebApplicationContext環(huán)境
session 同一個(gè)HTTP Session 共享一個(gè)Bean,不同Session使用不同Bean,僅適用于WebApplicationContext 環(huán)境
globalSession 一般用于Portlet應(yīng)用環(huán)境,該作用域僅適用于WebApplicationContext 環(huán)境
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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">

    <!-- 4 bean 作用域
        * singleton 單例,只創(chuàng)建一個(gè)實(shí)例。默認(rèn)值
        * prototype 多例,每一次都創(chuàng)建實(shí)例
        * request,request范圍,request.setAttribute
        * session,session范圍,session.setAttribute
        * globalSession , prolet 分布式門戶,sso(單點(diǎn)登錄)將不同的應(yīng)用的數(shù)據(jù)保存到globalSession中,達(dá)到數(shù)據(jù)共享
     -->
     <bean id="person" class="cn.ccj.c_beanscope.Person" scope="prototype"></bean>
    
</beans>

bean的生命周期

  1. instantiate bean對(duì)象實(shí)例化
  2. populate properties 封裝屬性
  3. 如果Bean實(shí)現(xiàn)BeanNameAware 執(zhí)行 setBeanName
  4. 如果Bean實(shí)現(xiàn)BeanFactoryAware 或者 ApplicationContextAware 設(shè)置工廠 setBeanFactory 或者上下文對(duì)象 setApplicationContext
  5. 如果存在類實(shí)現(xiàn) BeanPostProcessor(后處理Bean) ,執(zhí)行postProcessBeforeInitialization
  6. 如果Bean實(shí)現(xiàn)InitializingBean 執(zhí)行 afterPropertiesSet
  7. 調(diào)用<bean init-method="init"> 指定初始化方法 init
  8. 如果存在類實(shí)現(xiàn) BeanPostProcessor(處理Bean) ,執(zhí)行postProcessAfterInitialization
  9. 執(zhí)行業(yè)務(wù)處理
  10. 如果Bean實(shí)現(xiàn) DisposableBean 執(zhí)行 destroy
  11. 調(diào)用<bean destroy-method="customerDestroy"> 指定銷毀方法 customerDestroy

Spring 注解

注解裝配bean

  • @Component 普通組件bean注解
  • @Controller 用于配置表示層web
  • @Service 用于配置業(yè)務(wù)層邏輯service層
  • @Repository 用于配置數(shù)據(jù)訪問層Dao

舉例子

//表現(xiàn)層 web
@Controller("myweb")
public class Web {
    
    @Autowired
    private Service service;
    
    public void save(){
        service.save();
        System.out.println("web save");
    }

}
//業(yè)務(wù)邏輯service
@org.springframework.stereotype.Service
public class Service {
    
    @Autowired
    @Qualifier("myDao")
    private Dao dao;
    
    public void save(){
        dao.save();
        System.out.println("service save");
    }

}

//數(shù)據(jù)持久層 Dao層
@Repository("myDao")
public class Dao {

    public void save(){
        System.out.println("dao save");
    }
}
//bean.xml配置
//Spring容器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 確定使用注解  -->
    <context:annotation-config></context:annotation-config>
    <!-- 自動(dòng)掃描指定的包 -->
    <context:component-scan base-package="cn.ccj.spring"></context:component-scan>
</beans>

spring里面的注解

@Qualifier

@Autowired注解來指定自動(dòng)裝配,@Autowired可以修飾setter方法、普通方法、實(shí)例變量和構(gòu)造器等。當(dāng)使用@Autowired標(biāo)注setter方法時(shí),默認(rèn)采用byType自動(dòng)裝配策略。在這種策略下,符合自動(dòng)裝配類型的候選Bean實(shí)例常常有多個(gè),這個(gè)時(shí)候就可能引起異常,為了實(shí)現(xiàn)精確的自動(dòng)裝配,Spring提供了@Qualifier注解,通過使用@Qualifier,允許根據(jù)Bean的id來執(zhí)行自動(dòng)裝配。

使用@PostConstruct和@PreDestroy定制生命周期行為

@PostConstruct和@PreDestroy同樣位于javax.annotation包下,也是來自JavaEE規(guī)范的兩個(gè)Annotation,Spring直接借鑒了它們,用于定制Spring容器中Bean的生命周期行為。它們都用于修飾方法,無須任何屬性。其中前者修飾的方法時(shí)Bean的初始化方法;而后者修飾的方法時(shí)Bean銷毀之前的方法。

@Component("book")
public class Book {
    
    @PostConstruct
    public void init(){
        System.out.println("初始化");
    }
    
    @PreDestroy
    public void destory(){
        System.out.println("銷毀");
    }

}

@Scope("singleton")

  • @Scope("singleton") 給當(dāng)前bean配置范圍,取值:singleton、prototype等

spring里面的注解詳解

Spring基礎(chǔ)知識(shí)匯總 Java開發(fā)必看

Spring的AOP

,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP(面向?qū)ο缶幊蹋┑难永m(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。

經(jīng)典應(yīng)用:事務(wù)管理、性能監(jiān)視、安全檢查、緩存 、日志等
AOP核心概念

1、橫切關(guān)注點(diǎn)

對(duì)哪些方法進(jìn)行攔截,攔截后怎么處理,這些關(guān)注點(diǎn)稱之為橫切關(guān)注點(diǎn)

2、切面(aspect)

類是對(duì)物體特征的抽象,切面就是對(duì)橫切關(guān)注點(diǎn)的抽象

3、連接點(diǎn)(joinpoint)

被攔截到的點(diǎn),因?yàn)镾pring只支持方法類型的連接點(diǎn),所以在Spring中連接點(diǎn)指的就是被攔截到的方法,實(shí)際上連接點(diǎn)還可以是字段或者構(gòu)造器

4、切入點(diǎn)(pointcut)

對(duì)連接點(diǎn)進(jìn)行攔截的定義

5、通知(advice)

所謂通知指的就是指攔截到連接點(diǎn)之后要執(zhí)行的代碼,通知分為前置、后置、異常、最終、環(huán)繞通知五類

6、目標(biāo)對(duì)象

代理的目標(biāo)對(duì)象

7、織入(weave)

將切面應(yīng)用到目標(biāo)對(duì)象并導(dǎo)致代理對(duì)象創(chuàng)建的過程

8、引入(introduction)

在不修改代碼的前提下,引入可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或字段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,475評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,516評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,728評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,249評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,484評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容