慢慢進階spring(二)之spring常用配置

spring是一個輕量級的企業(yè)開發(fā)一站式解決方案框架。spring使用簡單的POJO來進行開發(fā),每一個被spring管理的java對象,被稱為bean毡惜。而spring提供了ioc容器來創(chuàng)建和維護bean之間的依賴關(guān)系。

IOC與DI

插自官網(wǎng)的一段介紹:

file

在spring中岂津,IOC(控制反轉(zhuǎn))與DI(依賴注入)是同等的概念虱黄。控制反轉(zhuǎn)是通過依賴注入來實現(xiàn)的吮成。所謂的依賴注入是指橱乱,被spring管理的bean,他們初始化以及之間依賴關(guān)系粱甫,由spring容器來生產(chǎn)bean泳叠,以及管理維護他們之間存在的依賴,以達到解耦的目的茶宵。簡單的說危纫,spring的ioc容器負責(zé)創(chuàng)建bean,并且將bean注入到另一個存在依賴關(guān)系的bean中乌庶。

spring可以通過xml配置种蝶,以及注解方式。無論哪一種方式瞒大,springioc容器都對它們進行解析螃征,然后bean初始化,配置透敌,依賴管理《⒐觯現(xiàn)在大部分公司都是使用注解方式。

注解配置

聲明bean的注解

  • @Controller:用于springmvc的表現(xiàn)層酗电。
  • @Service:用于業(yè)務(wù)層魄藕,也就是我們寫的service
  • @Repository:用于數(shù)據(jù)訪問層,就是我們寫的dao
  • @Component:本身沒有實際的意思撵术,只是標注為bean背率。也就是我們?nèi)绻麑⒁粋€Java對象交給spring容器管理,除了以上三種外,還可以使用這種通用的組件

除了以上四種退渗,還存在@Configuration與@Bean結(jié)合使用的方式移稳。

注入bean的注解

  • @Autowired:常用蕴纳,應(yīng)用于屬性或者屬性的setter方法会油。屬于spring提供的注解
  • @Inject:JSR-330提供的注解,不常用
  • @Resource:JSR-250提供的注解古毛,常用

聲明bean的注解與注入bean的注解結(jié)合使用案例:

一翻翩,引入依賴:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>

二,創(chuàng)建HelloRepository:

@Repository
public class HelloRepository {
    public void sayHello(String content){
        System.out.println(" sayHello : " + content);
    }
}

@Repository表示將HelloRepository的實例化交給spring容器管理

HelloService:

@Service
public class HelloService {
    @Autowired
    private HelloRepository helloRepository;
    public void sayHello(String content){
        helloRepository.sayHello(content);
    }
}

@Service表示將HelloService交給spring容器管理
@Autowired表示將HelloRepository依賴給注入進來稻薇,也就是將上邊創(chuàng)建好的HelloRepository給注入嫂冻。

三,創(chuàng)建AppConfig:

@ComponentScan("com.spring.*")
public class AppConfig {
}

@ComponentScan("com.spring.*")表示以com.spring為根包向下掃描塞椎,將掃到@Controller桨仿,@Service,@Repository案狠,@Component注解的類服傍,都交給spring容器管理注冊為bean

四,使用AnnotationConfigApplicationContext容器:

public class SpringDemoMain {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        HelloService bean = ac.getBean(HelloService.class);
        bean.sayHello("你好啊");
    }
}

運行后輸出:

file

我們還可使用@Configuration與@Bean結(jié)合方式創(chuàng)建bean

一骂铁,將@Service吹零,@Repository去掉,修改AppConfig類:

@ComponentScan("com.spring.*")
@Configuration
public class AppConfig {
    
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }

    @Bean
    public HelloRepository helloRepository(){
        return new HelloRepository();
    }
    
}

@Configuration:表示這個是個配置類
@Bean:表示當(dāng)前聲明方法返回一個bean拉庵,交給spring管理灿椅。

二,運行SpringDemoMain的main方法钞支,輸出:

file

效果是一樣的茫蛹。springioc容器自動幫我們創(chuàng)建并且維護各個bean之間的依賴關(guān)系。

beab的Scope

scope在spring中描述如何新建bean的實例烁挟,準確的說是描述bean的作用域婴洼。scope有以下幾個常用的值

  • singleton:默認配置。單例模式信夫,表示一個spring容器中只能有一個bean的實例
  • prototype:允許每次使用的時候窃蹋,都新建一個新的bean
  • request:表示web項目中,每次http request都新建一個bean
  • session:表示web項目中静稻,每次http session都新建一個bean

1警没,看singleton例子:

file
file

最后輸出:

file

2,看prototype例子:

file

最后輸出:

file

beab的生命周期回調(diào)

在某些業(yè)務(wù)下振湾,我們也許會有這樣的需求杀迹,在bean創(chuàng)建或者銷毀做一些有必要的任務(wù)。spring提供了對bean生命周期操作的支持:

  • @PostConstruct 押搪,@PreDestroy方式

1)@PostConstruct表示bean構(gòu)造器完成之后執(zhí)行的方法树酪。使用方式如下:

 @PostConstruct
public void init(){
    System.out.println("PostConstruct..............");
}

2)@PreDestroy表示bean銷毀之前執(zhí)行浅碾。使用方式如下:

@PreDestroy
public void destroy(){
    System.out.println("PreDestroy..............");
}

以上代碼的例子:

file

最后輸出:

file
  • @bean的initMethod和destroyMethod方式

1)initMethod:指定bean的initMethod方法在構(gòu)造器之后執(zhí)行

2)destroyMethod:指定bean的destroyMethod方法在銷毀之前執(zhí)行

例子:

IndexService.class

file

AppConfig.class

file
public class SpringDemoMain {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        IndexService bean = ac.getBean(IndexService.class);
        ((AnnotationConfigApplicationContext) ac).close();
    }
}

最后輸出:

file

spring事件(Application Event)

spring的事件為bean與bean之間提供了消息通信的支持。當(dāng)一個bean完成一個任務(wù)之后续语,希望另一個bean能做出響應(yīng)的任務(wù)垂谢,那么就能使用spring事件機制完成。

使用spring事件需要完成三個步驟即可

1)自定義事件疮茄,繼承ApplicationEvent

public class IndexEvent extends ApplicationEvent {
    public String msg;
    public IndexEvent(Object source,String msg) {
        super(source);
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void myIndexEvent(){
        System.out.println("myIndexEvent滥朱。。力试。徙邻。。畸裳。缰犁。。怖糊。帅容。。蓬抄。" + msg);
    }
}

2)自定義事件監(jiān)聽器丰嘉,實現(xiàn)ApplicationListener。注意要把創(chuàng)建的監(jiān)聽器交給容器管理

@Component
public class IndexListener implements ApplicationListener<IndexEvent> {

    public void onApplicationEvent(IndexEvent indexEvent) {
        System.out.println("監(jiān)聽器監(jiān)聽事件............");
        indexEvent.myIndexEvent();
    }
}

注意加上@Component

3)使用spring容器發(fā)布事件

public class SpringDemoMain {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        IndexService bean = ac.getBean(IndexService.class);

        ac.publishEvent(new IndexEvent(bean,"spring事件嚷缭。饮亏。。阅爽。路幸。"));
    }
}

最后輸出:

file

本人水平有限,難免有錯誤或遺漏之處付翁,望大家指正和諒解简肴,提出寶貴意見,愿與之交流百侧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砰识,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佣渴,更是在濱河造成了極大的恐慌辫狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辛润,死亡現(xiàn)場離奇詭異膨处,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門真椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹃答,“玉大人,你說我怎么就攤上這事突硝〔馑ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵狞换,是天一觀的道長避咆。 經(jīng)常有香客問我舟肉,道長修噪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任路媚,我火速辦了婚禮黄琼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘整慎。我一直安慰自己脏款,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布裤园。 她就那樣靜靜地躺著撤师,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拧揽。 梳的紋絲不亂的頭發(fā)上剃盾,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音淤袜,去河邊找鬼痒谴。 笑死,一個胖子當(dāng)著我的面吹牛铡羡,可吹牛的內(nèi)容都是我干的积蔚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烦周,長吁一口氣:“原來是場噩夢啊……” “哼尽爆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起读慎,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漱贱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贪壳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饱亿,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彪笼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻注。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖配猫,靈堂內(nèi)的尸體忽然破棺而出幅恋,到底是詐尸還是另有隱情,我是刑警寧澤泵肄,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布捆交,位于F島的核電站,受9級特大地震影響腐巢,放射性物質(zhì)發(fā)生泄漏品追。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一冯丙、第九天 我趴在偏房一處隱蔽的房頂上張望肉瓦。 院中可真熱鬧,春花似錦胃惜、人聲如沸泞莉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲫趁。三九已至,卻和暖如春利虫,著一層夾襖步出監(jiān)牢的瞬間挨厚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工列吼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幽崩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓寞钥,卻偏偏與公主長得像慌申,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子理郑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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