spring是一個輕量級的企業(yè)開發(fā)一站式解決方案框架。spring使用簡單的POJO來進行開發(fā),每一個被spring管理的java對象,被稱為bean毡惜。而spring提供了ioc容器來創(chuàng)建和維護bean之間的依賴關(guān)系。
IOC與DI
插自官網(wǎng)的一段介紹:
在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("你好啊");
}
}
運行后輸出:
我們還可使用@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方法钞支,輸出:
效果是一樣的茫蛹。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例子:
最后輸出:
2,看prototype例子:
最后輸出:
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..............");
}
以上代碼的例子:
最后輸出:
- @bean的initMethod和destroyMethod方式
1)initMethod:指定bean的initMethod方法在構(gòu)造器之后執(zhí)行
2)destroyMethod:指定bean的destroyMethod方法在銷毀之前執(zhí)行
例子:
IndexService.class
AppConfig.class
public class SpringDemoMain {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
IndexService bean = ac.getBean(IndexService.class);
((AnnotationConfigApplicationContext) ac).close();
}
}
最后輸出:
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事件嚷缭。饮亏。。阅爽。路幸。"));
}
}
最后輸出:
本人水平有限,難免有錯誤或遺漏之處付翁,望大家指正和諒解简肴,提出寶貴意見,愿與之交流百侧。