-
bean1單例,Bean2多例的時(shí)候
如果想要注入的bean2是不同bean2時(shí),可以用
????類中定義abstract抽象方法,protect abstract Bean2 createBean2();
????配置文件種 原來property標(biāo)簽注入的,改用lookup-method標(biāo)簽注入name制定淚中方法,bean制定注入bean2
查看全部 -
1、構(gòu)造方式注入
????類中有帶參數(shù)構(gòu)造方法
????xml中配置bean,子標(biāo)簽constructor-arg標(biāo)簽,配置屬性? index、name、type確定構(gòu)造參數(shù),配置value,ref給屬性賦值(ref用用,value基本)
還要簡便寫法如圖,要改一下文件上面頭部申明
2、集合類型注入
????類中g(shù)et/set方法
????xml中配置property標(biāo)簽,標(biāo)簽下子標(biāo)簽list,list下用value/ref標(biāo)簽賦值;set用set標(biāo)簽,下面也用value/ref標(biāo)簽賦值;map用Map標(biāo)簽,entry標(biāo)簽賦值;properties,子標(biāo)簽props子標(biāo)簽prop賦值
查看全部 -
Spring實(shí)例化bean的三種方式:
1、構(gòu)造方法實(shí)例化Bean
2、靜態(tài)方法實(shí)例化Bean
????BeanFactory類,類中有靜態(tài)方法,作用實(shí)例化Bean
????xml中配置BeanFactory,標(biāo)簽屬性中factory-method=類中實(shí)例化Bean的靜態(tài)方法
3、實(shí)例化方法實(shí)例化Bean
????BeanFactory類,類中有方法,作用實(shí)例化Bean
????xml中配置BeanFactory,
????xml中配置bean,bean的屬性中factory-bean=factoryBean? ,factory-method=factory中實(shí)例化bean的方法
4、Bean的別名
查看全部 -
IoC容器約定
查看全部 -
Spring通過注解注入Bean
@Autowired:通過該注解實(shí)現(xiàn)構(gòu)造方法注入和set方法注入,可以標(biāo)識在有參構(gòu)造方法上、set方法上、屬性上。
一、通過方法注入Bean
1:通過有參構(gòu)造方法注入
步驟1:創(chuàng)建掃描配置類,并添加注解@Configuration、@ComponentScan(value=“路徑”)
代碼:
@Configuration
@ComponentScan(value="springzhuru")
public class MyConfiguration {
}
步驟2:創(chuàng)建要實(shí)例化的Bean,并提供有參的構(gòu)造方法,并在構(gòu)造方法上添加注解@Autowired在類上添加@Component。
代碼:@Component
public class MyBean {
private AnotherBean anotherBean;
@Autowired
public MyBean(AnotherBean anotherBean) {
super();
this.anotherBean = anotherBean;
}
查看全部 -
SpringIOC注解基本使用(spring2.5后支持注解來管理javaBean)
@Configuration:該注解標(biāo)識在類上,然后就可以通過AnnotationConfigApplicationContext(***.class)來獲取spring上下文環(huán)境(相當(dāng)于xml的功能)。
@Bean:與xml配置文件<bean>標(biāo)簽一個(gè)用處,<bean>標(biāo)簽的id相當(dāng)于獲得@Bean(name="Id名"),如果不使用name,Id名為方法名稱。
@Component:告知spring管理這個(gè)類,還可以通過該注解的value屬性指定Bean的Id。
@Controller:被標(biāo)注在Controller層。
@Service:被標(biāo)注在Service層。
@Repository:被標(biāo)注在Dao層
與Spring.xml相比不同點(diǎn):
1、不用配置xml文件
2、提供一個(gè)配置類,并采用注解,來獲取Bean
3、獲取spring上下文的對象不同,注解使 用AnnotationConfigApplicationContext(***.class)獲取spring上下文。
步驟1:提供一個(gè)配置類,并在類上添加@Configuration注解,并提供一個(gè)返回Bean對象的方法,并在該方法上添加注解。(如果@Bean沒指定name屬性,則Id為方法名)
步驟2:提供一個(gè)要?jiǎng)?chuàng)建的Bean的類。
如何進(jìn)行簡化:當(dāng)要獲取多個(gè)Bean時(shí),則要編寫多個(gè)@Bean注解和獲取Bean方法?
步驟1:在配置類中添加@ComponentScan(value=“掃描的路徑”)注解。
@ComponentScan()注解的作用:掃描帶有注解@Component的Class,Spring將管理這些Class。
步驟2:Bean的類上加注解@Component,它的Bean的Id是類名的首字母小寫的全稱,如果不想使用這種方式,則使用@Component(value=“Id名”)。
spring.xml中開啟包掃描:<context:component-scan base-package="掃描的包路徑"/>
如何給Bean取別名(一個(gè)Bean對應(yīng)多個(gè)Id名)?
因?yàn)锽ean()注解里的name屬性是String類型的數(shù)組,所以可以通過它來指定Bean的多個(gè)Id。注意:@Component里的value是字符串類型,只能有一個(gè)BeanId。
spring.xml給Bean取別名?
<bean id="bean1" name="bean2,bean3" class="..."/>
<alias name="bean1" ?alias="bean4"/>
查看全部 -
Bean屬性繼承應(yīng)用場景:
場景一:ParentClass(屬性1,屬性2,屬性3,get和set方法)
子類1(屬性4,屬性5)?
子類2(屬性6,屬性7)
場景2:子類1和子類2沒有父類,而是有一些相同的屬性。
類1:(屬性1,屬性2,屬性3,屬性4,屬性5)
類2:(屬性1,屬性2,屬性3,屬性6,屬性7)
abstract="true":設(shè)置<bean>標(biāo)簽只是定義性的,不會(huì)對它進(jìn)行實(shí)例化操作。
parent屬性:在Bean的子類bean標(biāo)簽添加,值為父類的Id。
查看全部 -
Bean初始化及銷毀邏輯處理(在singleton作用域上進(jìn)行講解)
Bean初始化——如果需要在Bean實(shí)例化時(shí)執(zhí)行一些邏輯,Spring提供了兩種方法:(有一個(gè)javaBean,該Bean作用,連接數(shù)據(jù)庫,例如session,斷開數(shù)據(jù)庫連接,該Bean被創(chuàng)建之后,執(zhí)行數(shù)據(jù)庫連接的過程)
方法1:bean標(biāo)簽里的init-method屬性,該值為Bean的某一方法,Spring實(shí)例化時(shí),會(huì)調(diào)用Bean的該方法。
方法2:讓Bean實(shí)現(xiàn)InitializingBean接口,Spring在實(shí)例化該Bean時(shí),檢測到Bean實(shí)現(xiàn)了該接口,就會(huì)調(diào)用該接口所定義的相應(yīng)方法。
Bean銷毀——如果需要在Bean銷毀之前執(zhí)行一些邏輯,有兩種方法。
方法1:bean標(biāo)簽里的destory-method屬性,該值為Bean的某一方法,Spring銷毀該Bean時(shí),會(huì)調(diào)用Bean的該方法。
方法2:讓Bean實(shí)現(xiàn)DisposableBean接口,Spring在銷毀該Bean時(shí),檢測到Bean實(shí)現(xiàn)了該接口,就會(huì)調(diào)用該接口所定義的相應(yīng)方法。
查看全部 -
Bean懶加載概念:
Spring容器會(huì)在創(chuàng)建容器時(shí)提前初始化Singleton作用域的bean,但是如果Bean被標(biāo)注了lazy-init=“true”,則該Bean只有在其被需要的時(shí)候才會(huì)被初始化。(只對singleton作用域的bean有效)
代碼:<bean id="bean" class="main.java.com.Bean懶加載.Bean" scope="singleton" lazy-init="true"></bean>
解決多個(gè)bean使用懶加載問題:
<beans標(biāo)簽里添加default-lazy-init=“true”>:表示spring配置文件里所有bean都是懶加載模式。
使用場景:
如果某個(gè)Bean在程序整個(gè)運(yùn)行周期都可能不會(huì)被使用,那么可考慮設(shè)定該Bean為懶加載。
優(yōu)點(diǎn):盡可能的節(jié)省了資源。
缺點(diǎn):可能會(huì)導(dǎo)致某個(gè)操作相應(yīng)操作時(shí)間增加。
查看全部 -
spring通過xml實(shí)現(xiàn)自定義作用域(自定義雙例模式作用域)
SimpleThreadScope:Spring內(nèi)置作用域。
編寫自定義作用域:
步驟1:實(shí)現(xiàn)Scope接口(org.springframework.beans.factory.config),主要關(guān)注實(shí)現(xiàn)的get方法和remove方法。
get方法:按照name參數(shù),按照我們自己定義的規(guī)則,去返回一個(gè)Bean,如果我們定義的規(guī)則里,Bean不存在,那么將通過objectFactory去創(chuàng)建一個(gè)Bean。
雙例模式:一個(gè)bean的Id對應(yīng)兩個(gè)實(shí)例,實(shí)現(xiàn)雙例模式,需要兩個(gè)Map集合,Map<String,Object> map1=new HashMap<String,Object>();Map<String,Object> map2=new HashMap<String,Object>();。
查看全部 -
springweb上下文環(huán)境
request作用域:每次執(zhí)行request請求調(diào)用到bean時(shí)會(huì)重新實(shí)例化bean對象
session作用域:請求session重置后會(huì)重新實(shí)例化
application作用域:應(yīng)用重啟后會(huì)重新實(shí)例化
查看全部 -
通過Spring的xml文件配置Bean作用域:(Spring默認(rèn)作用域是Singleton)
1、Singleton作用域(單例模式:通過Spring容器實(shí)現(xiàn)單例模式,具有局限性:保證在一個(gè)Spring上下文(ApplicationContext)是單例模式,多個(gè)AppliactionContext單例模式就失效了。
定義:如果一個(gè)<bean>的作用域?yàn)镾ingleton,則該<bean>只會(huì)被實(shí)例化一次,只有一個(gè)Bean會(huì)被創(chuàng)建。(每次向Spring上下文(ApplicationContext生命周期存活)請求這個(gè)實(shí)例時(shí),Spring都會(huì)返回同一個(gè)實(shí)例)。
2、prototype作用域(多例模式)
定義:如果一個(gè)<bean>的作用域?yàn)閜rototype,則該<bean>會(huì)被實(shí)例化多次,有多個(gè)Bean會(huì)被創(chuàng)建(每次向Spring上下文請求該Bean都會(huì)new一個(gè)新的實(shí)例)。
查看全部 -
第一種:通過構(gòu)造方法注入Bean
#<bean>標(biāo)簽管理class對象。
#bean的構(gòu)造方法參數(shù)標(biāo)簽 constructor-arg。
#index 表示構(gòu)造方法的第幾個(gè)參數(shù)。
#name 表示構(gòu)造方法的參數(shù)名。
#type 表示對應(yīng)的參數(shù)類型。
#value 表示為參數(shù)提供賦值,一般用于String等簡單常用對象。
#ref 表示為參數(shù)提供賦值,一般是復(fù)雜點(diǎn)的依賴其它 class的對象(取bean的id)。
注意:只要通過index、name、type的組合明確表示出構(gòu)造函數(shù)的那一個(gè)參數(shù)即可,
不一定全用,只用index也可以。
<bean class="com.imooc.spring.ioc.class06.Bean">
<constructor-arg ?index="0" name="anotherBean"
type="com.imooc.spring.ioc.class06.AnotherBean">
</constructor-arg>?
</bean>
通過構(gòu)造方法注入Bean,輸出結(jié)果:
成功的給屬性賦值。?
查看全部 -
1、通過構(gòu)造方法實(shí)例化Bean。
步驟1:創(chuàng)建要實(shí)例化的類,并提供無參構(gòu)造方法。
public class Bean {
public Bean(){
System.out.println("Bean被創(chuàng)建了");
}
步驟2:spring.xml中配置
<bean id="bean的唯一標(biāo)識" class="要實(shí)例化bean的路徑"></bean>
測試:ApplicationContext context=new ClassPathXmlApplicationContext(spring.xml的路徑);
Bean bean=context.getBean("bean",Bean.class);
System.out.println(bean);
2、通過靜態(tài)方法實(shí)例化Bean。(通過Bean2的工廠的靜態(tài)方法實(shí)例化Bean)
步驟1:創(chuàng)建Bean2的工廠Bean2Factory類以及Bean2類,并且提供一個(gè)靜態(tài)、返回值類型為Bean2的方法,返回new Bean2()。
public class Bean2Factory {
public static Bean2 getBean2(){
return new Bean2();
}
}
public class Bean2 {
public Bean2(){
System.out.println("Bean2被創(chuàng)建了。");
}
步驟2:配置Spring.xml
<bean class="Bean2工廠的路徑" factory-method="Bean2工廠的靜態(tài)方法名" id="Bean2工廠的唯一標(biāo)識"></bean>
測試:
ApplicationContext context=new ClassPathXmlApplicationContext("spring-ioc2.xml");
Bean2 bean=context.getBean("bean2factoryId",Bean2.class);
System.out.println(bean);
3、通過實(shí)例方法實(shí)例化Bean。(通過Bean2的工廠的實(shí)例方法實(shí)例化Bean)
步驟1:創(chuàng)建Bean3的工廠Bean3Factory類以及Bean3類,并且提供一個(gè)返回值類型為Bean3的方法,方法返回new Bean3()。
public class Bean3Factory {
public ?Bean3 getBean3(){
return new Bean3();
}
}
public class Bean3 {
public Bean3(){
System.out.println("Bean3被創(chuàng)建了。");
}
}
步驟2:配置Spring.xml
<bean class="main.java.com.imooc2.Bean3Factory" id="bean3Factory"></bean>
<bean class="main.java.com.imooc2.Bean3" factory-bean="bean3Factory" factory-method="getBean3" id="bean3"></bean>
給bean取別名:有類Bean1,并且通過bean標(biāo)簽實(shí)例化Bean1,給Bean1的實(shí)例取多個(gè)名字。
例如:方式一:bean標(biāo)簽里添加name屬性
<bean id="bean" class="main.java.com.imooc1.Bean" name="bean1_1,bean1_2"></bean>
? ? ? ? ? ?方式二:添加<alias>標(biāo)簽
<bean id="bean" class="main.java.com.imooc2.Bean1" name="bean1_1,bean1_2"></bean>
<alias name="bean" alias="bean1_3"/><!-- alias只支持一個(gè)別名 -->
查看全部 -
org.springframework.beans.factory.config
查看全部
舉報(bào)