久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Spring4新特性——核心容器的其他改進(jìn)

 stwei1983 2016-04-24

接上一篇《Spring4新特性——泛型限定式依賴注入》,接下來(lái)我們看看Spring4的其他改進(jìn)。

 

1,、Map依賴注入:

Java代碼  收藏代碼
  1. @Autowired  
  2. private Map<String, BaseService> map;  

這樣會(huì)注入:key是bean名字,;value就是所有實(shí)現(xiàn)了BaseService的Bean,,假設(shè)使用上一篇的例子,,則會(huì)得到:

{organizationService=com.sishuok.spring4.service.OrganizationService@617029, userService=com.sishuok.spring4.service.UserService@10ac73b}

 

2,、List/數(shù)組注入:

Java代碼  收藏代碼
  1. @Autowired  
  2. private List<BaseService> list;  

 這樣會(huì)注入所有實(shí)現(xiàn)了BaseService的Bean,;但是順序是不確定的,,如果我們想要按照某個(gè)順序獲取,;在Spring4中可以使用@Order或?qū)崿F(xiàn)Ordered接口來(lái)實(shí)現(xiàn),,如:

Java代碼  收藏代碼
  1. @Order(value = 1)  
  2. @Service  
  3. public class UserService extends BaseService<User> {  
  4. }  

這種方式在一些需要多態(tài)的場(chǎng)景下是非常有用的。

 

3,、@Lazy可以延遲依賴注入:

Java代碼  收藏代碼
  1. @Lazy  
  2. @Service  
  3. public class UserService extends BaseService<User> {  
  4. }  
Java代碼  收藏代碼
  1. @Lazy  
  2. @Autowired  
  3. private UserService userService;  

 我們可以把@Lazy放在@Autowired之上,,即依賴注入也是延遲的;當(dāng)我們調(diào)用userService時(shí)才會(huì)注入,。即延遲依賴注入到使用時(shí),。同樣適用于@Bean。

 

4,、@Conditional

@Conditional類似于@Profile(一般用于如我們有開(kāi)發(fā)環(huán)境,、測(cè)試環(huán)境、正式機(jī)環(huán)境,,為了方便切換不同的環(huán)境可以使用@Profile指定各個(gè)環(huán)境的配置,,然后通過(guò)某個(gè)配置來(lái)開(kāi)啟某一個(gè)環(huán)境,方便切換,,但是@Conditional的優(yōu)點(diǎn)是允許自己定義規(guī)則,。可以指定在如@Component、@Bean,、@Configuration等注解的類上,,以絕對(duì)Bean是否創(chuàng)建等。首先來(lái)看看使用@Profile的用例,,假設(shè)我們有個(gè)用戶模塊:

1,、在測(cè)試/開(kāi)發(fā)期間調(diào)用本機(jī)的模擬接口方便開(kāi)發(fā);

2,、在部署到正式機(jī)時(shí)換成調(diào)用遠(yuǎn)程接口,;

Java代碼  收藏代碼
  1. public abstract class UserService extends BaseService<User> {  
  2. }  
  3.   
  4. @Profile("local")  
  5. @Service  
  6. public class LocalUserService extends UserService {  
  7. }  
  8.   
  9. @Profile("remote")  
  10. @Service  
  11. public class RemoteUserService extends UserService {  
  12. }  

我們?cè)趯?xiě)測(cè)試用例時(shí),可以指定我們使用哪個(gè)Profile:

Java代碼  收藏代碼
  1. @ActiveProfiles("remote")  
  2. @RunWith(SpringJUnit4ClassRunner.class)  
  3. @ContextConfiguration(locations =  "classpath:spring-config.xml")  
  4. public class ServiceTest {  
  5.   
  6.     @Autowired  
  7.     private UserService userService;  
  8. }  

  這種方式非常簡(jiǎn)單,。如果想自定義如@Profile之類的注解等,,那么@Conditional就派上用場(chǎng)了;假設(shè)我們系統(tǒng)中有好多本地/遠(yuǎn)程接口,,那么我們定義兩個(gè)注解@Local和@Remote注解要比使用@Profile方便的多,;如:

 

Java代碼  收藏代碼
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target({ElementType.TYPE, ElementType.METHOD})  
  3. @Conditional(CustomCondition.class)  
  4. public @interface Local {  
  5. }  
  6.   
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Target({ElementType.TYPE, ElementType.METHOD})  
  9. @Conditional(CustomCondition.class)  
  10. public @interface Remote {  
  11. }  

 

Java代碼  收藏代碼
  1. public class CustomCondition implements Condition {  
  2.   
  3.     @Override  
  4.     public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  
  5.         boolean isLocalBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Local");  
  6.         boolean isRemoteBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Remote");  
  7.         //如果bean沒(méi)有注解@Local或@Remote,返回true,,表示創(chuàng)建Bean  
  8.         if(!isLocalBean && !isRemoteBean) {  
  9.             return true;  
  10.         }  
  11.   
  12.         boolean isLocalProfile = context.getEnvironment().acceptsProfiles("local");  
  13.   
  14.         //如果profile=local 且 bean注解了@Local,,則返回true 表示創(chuàng)建bean;  
  15.         if(isLocalProfile) {  
  16.             return isLocalBean;  
  17.         }  
  18.   
  19.         //否則默認(rèn)返回注解了@Remote或沒(méi)有注解@Remote的Bean  
  20.         return isRemoteBean;  
  21.     }  
  22. }  

 

 然后我們使用這兩個(gè)注解分別注解我們的Service:

Java代碼  收藏代碼
  1. @Local  
  2. @Service  
  3. public class LocalUserService extends UserService {  
  4. }  

 

Java代碼  收藏代碼
  1. @Remote  
  2. @Service  
  3. public class RemoteUserService extends UserService {  
  4. }  

 

首先在@Local和@Remote注解上使用@Conditional(CustomCondition.class)指定條件,,然后使用 @Local和@Remote注解我們的Service,,這樣當(dāng)加載Service時(shí),會(huì)先執(zhí)行條件然后判斷是否加載為Bean,。@Profile就是這 樣實(shí)現(xiàn)的,,其Condition 是:org.springframework.context.annotation.ProfileCondition??梢匀タ聪略创a,,很簡(jiǎn)單。

 

5,、基于CGLIB的類代理不再要求類必須有空參構(gòu)造器了:

這是一個(gè)很好的特性,,使用構(gòu)造器注入有很多好處,,比如可以只在創(chuàng)建Bean時(shí)注入依賴,,然后就不變了,如果使用setter注入,,是允許別人改的,。當(dāng)然我們可以使用spring的字段級(jí)別注入。如果大家使用過(guò)如Shiro,,我們可能要對(duì)Controller加代理,。如果是類級(jí)別代理,此時(shí)要求Controller必須有空參構(gòu)造器,有時(shí)候挺煩人的,。spring如何實(shí)現(xiàn)的呢,?其內(nèi)聯(lián)了objenesis類庫(kù),通過(guò)它來(lái)實(shí)現(xiàn),,可以去其官網(wǎng)看看介紹,。這樣就支持如下方式的構(gòu)造器注入了:

 

Java代碼  收藏代碼
  1. @Controller  
  2. public class UserController {  
  3.     private UserService userService;  
  4.     @Autowired  
  5.     public UserController(UserService userService) {  
  6.         this.userService = userService;  
  7.     }  
  8. }  

 

org.springframework.cglib.proxy.Enhancer在其github和maven倉(cāng)庫(kù)中的source中竟然木有,其github:https://github.com/spring-projects/spring-framework/tree/master/spring-core/src/main/java/org/springframework/cglib,;難道忘了嗎,?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多