国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring核心 Bean的高級裝配

forrest23 / 3323人閱讀

摘要:在集成測試時,通常想要激活的是開發環境的。因為沒有耦合類名,因此可以隨意重構的類名,不必擔心破壞自動裝配。在裝配中,占位符的形式為使用包裝的屬性名稱。參數裝配的是名為的屬性值。

環境與profile 配置profile bean

在3.1版本中,Spring引入了bean profile的功能。使用profile,首先將所有不同的bean定義整理到一個或多個profile之中,再將應用部署到每個環境時,并確保對應的profile處于激活(active)的狀態

在Java配置中,可以使用@Profile注解指定某個bean屬于哪一個profile。例如,在配置類中,嵌入式數據庫的DataSource可能會配置成如下所示:

從Spring 3.2開始,可在方法級別上使用@Profile注解,與@Bean注解一同使用,如下所示:

//@Profile注解基于激活的profile實現bean的裝配

package com.myapp;
import javax.activation.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jndi.JndiObjectFactoryBean;  

@Configuration
public class DataSourceConfig
{
    @Bean(destroyMethod = "shutdown")
    @Profile("dev")                                //為dev profile裝配的bean
    public DataSource embeddedDataSourece()
    {
        return new EmbeddedDataBuilder()
            .setType(EmbeddedDataSourceType.H2)
            .setScript("classpath:schema.sql")
            .setScript("classpath:test-data.sql")
            .build();
    }
    
    @Bean
    @Profile("prod")                                //為profile profile裝配的bean
    public DataSource embeddedDataSourece()
    {
        JndiObjectFactoryBean jndiObjectFactoryBean = nre JndiObjectFactoryBean();
        jndiObjectFactoryBean.setJndiName("jdbc/myDS"); 
        jndiObjectFactoryBean.setResourceRef(true); 
        jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
        return (DataSource)jndiObjectFactoryBean.getObject(); 
    }
}  

注意:盡管每個DataSource bean都被聲明在一個profile中,并且只有當規定的profile激活時,相應的bean才會被創建,但可能會有其他的bean并沒有聲明在一個給定的profile范圍內。沒有指定profile的bean始終都會被創建,與激活哪個profile沒有關系

在XML中配置

可以在根元素中嵌套定義元素,而不為每個環境都創建一個profile XML文件。這能夠將所有的profile bean定義放到同一個XML文件中,如下所示:

// 重復使用元素來指定多個profile

                                //dev profile的bean 基于開發階段
    
        
        
    
    
                
                                    //qa profile的bean 基于連接池
        
    

                                    //prod profile的bean 基于生產環境
    
            

      

所有bean都定義到同一個XML文件之中,這種配置方式與定義在多帶帶的XML文件中的實際效果是一樣的。這里有三個bean,類型都是javax.sql.DataSource,并且ID都是dataSource。但是在運行時,只會創建一個bean,這取決于處于激活狀態的是哪個profile

激活profile

Spring在確定哪個profile處于激活狀態時,需要依賴兩個獨立的屬性:spring.profiles.active和
spring.profiles.default

如果設置了spring.profiles.active屬性的話,那么它的值就會用來確定哪個profile是激活的。但如果沒有設置spring.profiles.active屬性的話,那Spring將會查找spring.profiles.default的值。如果spring.profiles.active和spring.profiles.default均沒有設置的話,那就沒有激活的profile,因此只會創建那些沒有定義在profile中的bean

設置這兩個屬性的方式:

作為DispatcherServlet的初始化參數

作為Web應用的上下文參數

作為JNDI條目

作為環境變量

作為JVM的系統屬性

在集成測試類上,使用@ActiveProfiles注解設置

// 在Web應用的web.xml文件中設置默認的profile


    
    
        contextConfigLocation
         /WEB-INF/spring/root-context.xml 
       

                                            // 為上下文設置默認的proflie
        spring.profiles.default
         dev 
       
    
    
        
            org.springframework.web.context.ContextLoaderListener
        
    
    
    
        appServlet
        
            org.springframework.web.servlet.DispatcherServlet
        
        
            
                spring.profiles.default
            
             dev 
        
         1 
      
    
    
        appServlet
        /
    

        
使用profile進行測試

Spring提供了@ActiveProfiles注解,我們可以使用它來指定運行測試時要激活哪個profile。在集成測試時,通常想要激活的是開發環境的profile。如下的測試類片段展現了使用@ActiveProfiles激活dev profile:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceTestConfig.class})
@ActionProfiles("dev")
public class PersistenceTest
{
    ...
}
條件化的bean

@Conditional注解,可用到帶有@Bean注解的方法上。如果給定的條件計算結果為true,就會創建這個bean,否則
的話,這個bean會被忽略

設有名為MagicBean的類,希望只設置magic環境屬性時,Spring才會實例化這個類。如果環境中沒有這個屬性,那么MagicBean將會被忽略。在下述程序所展現的配置中,使用@Conditional注解條件化地配置了MagicBean:

// 條件化地配置bean
@Bean
@Conditional(MagicExistsCondition.class)                //條件化地創建bean
public MagicBean magicBean()
{
    return new MagicBean();
}

@Conditional給定一個Class,指明了條件——MagicExistsCondition。@Conditional將會通過Condition接口進行條件對比:

public interface Condition
{
    boolean matches(ConditionContext ctxt, AnnotationTypeMetadata metadata)
}

設置給@Conditional的類可以是任意實現了Condition接口的類型。該接口實現簡單直接,只需提供matches()方法的實現即可。如matches()方法返回true,那么就會創建帶有@Conditional注解的bean。如果matches()方法返回false,將不會創建這些bean

本例中,需要創建Condition的實現并根據環境中是否存在magic屬性來做出決策

// 在Condition中檢查是否存在magic屬性
package com.habuma.restfun;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ClassUtils;

public class MagicExistsCondition implements Condition
{
    public boolean matches(ConditionContext ctxt, AnnotationTypeMetadata metadata)
    {
        Environment env = context.getEnvironment();
        return env.containsProperty("magic");            // 檢查magic屬性
    }
}

ConditionContext的作用:

借助getRegistry()返回的BeanDefinitionRegistry檢查bean定義

借助getBeanFactory()返回的ConfigurableListableBeanFactory檢查bean是否存在,甚至探查bean的屬性

借助getEnvironment()返回的Environment檢查環境變量是否存在以及它的值是什么

讀取并探查getResourceLoader()返回的ResourceLoader所加載的資源

借助getClassLoader()返回的ClassLoader加載并檢查類是否存在

AnnotatedTypeMetadata能夠檢查帶有@Bean注解的方法上是否存在其他的注解及其屬性

處理自動裝配的歧義性 標示首選的bean

在聲明bean的時候,通過將其中一個可選的bean設置為首選(primary)bean能夠避免自動裝配時的歧義性。當遇到歧義性的時候,Spring將會使用首選的bean,而不是其他可選的bean

將@Component注解的IceCream bean聲明為首選的bean:

@Component
@Primary
public class IceCream implements Dessert
{
    ...
}

通過Java配置顯式地聲明IceCream,那么@Bean方法如下所示:

@Bean 
@Primary
public Dessert iceCream()
{
    return new IceCream();
}

通過XML配置bean,元素的primary屬性指定首選bean:


限定自動裝配的bean

Spring的限定符能夠在所有可選的bean上進行縮小范圍的操作,最終能夠達到只有一個bean滿足所規定的限制條件

@Qualifier注解是使用限定符的主要方式。它可以與@Autowired和@Inject協同使用,在注入的時候指定想要注入進去的是哪個bean。例如,我們想要確保要將IceCream注入到setDessert()之中:

@Autowired
@Qualifier("iceCream")
public void setDessert(Dessert dessert)
{
    this.dessert = dessert;
}
創建自定義的限定符

bean可以設置自己的限定符,而不依賴bean ID作為限定符。在這里所需要做的就是在bean聲明上添加@Qualifier注解。例如,它可以與@Component組合使用,如下所示:

@Component
@Qualifier("cold")
public class IceCream implements Dessert{...}

在這種情況下,cold限定符分配給了IceCreambean。因為沒有耦合類名,因此可以隨意重構IceCream的類名,不必擔心破壞自動裝配。在注入的地方,只要引用cold限定符就可以了:

@Autowired
@Qualifier("cold")
public void setDessert(Dessert dessert)
{
    this.dessert = dessert;
}

通過Java配置顯式定義bean時,@Qualifier可以與@Bean注解一起使用:

@beanlam[beanlam] 
@Qualifier("cold")
public Dessert iceCream()
{
    return new IceCream();
}
使用自定義的限定符注解

可以創建自定義的限定符注解,借助這樣的注解來表達bean所希望限定的特性。這里所需要做的就是創建一個注解,它本身要使用@Qualifier注解來標注。這樣將不再使用@Qualifier("cold"),而是使用自定義的@Cold注解,該注解的定義如下所示:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold{}

同樣可創建一個新的@Creamy注解來代替@Qualifier("creamy"):

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Creamy{}    

現在重新看一下IceCream,并為其添加@Cold和@Creamy注解,如下所示:

@Component
@Cold
@Creamy
public class IceCream implements Desser
{
    ...
}
bean的作用域

在默認情況下,Spring應用上下文中所有bean都是作為以單例(singleton)的形式創建的

Spring定義了多種作用域,可以基于這些作用域創建bean,包括:

單例(Singleton):在整個應用中,只創建bean的一個實例

原型(Prototype):每次注入或者通過Spring應用上下文獲取的時候,都會創建一個新的bean實例

會話(Session):在Web應用中,為每個會話創建一個bean實例

請求(Rquest):在Web應用中,為每個請求創建一個bean實例

單例是默認的作用域,但是正如之前所述,對于易變的類型。如果選擇其他的作用域,要使用@Scope注解,它可以與@Component或@Bean一起使用

使用組件掃描來發現和聲明bean,那么在bean的類上使用@Scope注解,將其聲明為原型bean::

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Notepad
{
    ...
}

使用Java配置將Notepad聲明為原型bean,組合使用@Scope和@Bean來指定所需的作用域::

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Notepad notepad()
{
    return new Notepad();
} 

使用XML配置bean,scope屬性設置作用域:


不管使用哪種方式來聲明原型作用域,每次注入或從Spring應用上下文中檢索該bean的時候,都會創建新的實例。這樣所導致的結果就是每次操作都能得到自己的Notepad實例

使用回話和請求作用域

對于購物車bean,會話作用域最為合適,因為它與給定的用戶關聯性最大。要指定會話作用域,可以使用@Scope注解,它的使用方式與指定原型作用域是相同的:

@Component
@Scope
{
    value = WebApplicationContext.SCOPE_SESSION,
    proxyMode = ScopedProxyMode.INTERFACES
}
public ShoppingCart cart()
{
    ...
}

將value設置成了WebApplicationContext中的SCOPE_SESSION常量(它的值是session)。Spring會為Web應用中的每個會話創建一個ShoppingCart。這會創建多個ShoppingCart bean的實例,但是對于給定的會話只會創建一個實例,在當前會話相關的操作中,這個bean實際上相當于單例的

proxyMode屬性被設置成了ScopedProxyMode.INTERFACES。這個屬性解決了將會話或請求作用域的bean注入到單例bean中所遇到的問題

若想將ShoppingCart bean注入到單例StoreService bean 的Setter方法中:

@Component
public class StoreService
{
    @Autowired
    public void setShoppingCart(ShoppingCart shoopingCart)
    {
        this.shoppingCart = shoppingCart;
    }
    ...
}

Spring并不會將實際的ShoppingCart bean注入到StoreService中,Spring會注入一個到ShoppingCart bean的代理。如下圖所示,這個代理會暴露與ShoppingCart相同的方法,所以StoreService會認為它就是一個購物車。但是,當StoreService調用ShoppingCart的方法時,代理會對其進行懶解析并將調用委托給會話作用域內真正的ShoppingCart bean

作用域代理能夠延遲注入請求和會話作用域的bean

如配置所示,proxyMode屬性被設置成了ScopedProxyMode.INTERFACES,這表明這個代理要實現ShoppingCart接口,并將調用委托給實現bean。如果ShoppingCart是接口,則是最理想的代理模式。但如果ShoppingCart是具體類,Spring就無法創建基于接口的代理。此時,它必須使用CGLib來生成基于類的代理。所以,如果bean類型是具體類的話,proxyMode屬性將設置為ScopedProxyMode.TARGET_CLASS,以此來表明要以生成目標類擴展的方式創建代理

在XML中聲明作用域代理

是與@Scope注解的proxyMode屬性功能相同的Spring XML配置元素。告知Spring為bean創建一個作用域代理。默認情況下,它會使用CGLib創建目標類的代理。但是也可將proxy-target-class屬性設置為false,進而要求它生成基于接口的代理:


    

使用元素,必須在XML配置中聲明Spring的aop命名空間:



運行時值注入

避免硬編碼值,讓這些值在運行時再確定。為了實現這些功能,Spring提供了兩種在運行時求值的方式:

屬性占位符(Property placeholder)

Spring表達式語言(SpEL,Spring Expression Language)

注入外部的值
//使用@PropertySource注解和Environment

package soundsystem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;  

@Configuration
@PropertySource("classpath:/com/soundsystem/app.properties")        // 聲明屬性源
public class ExpressiveConfig
{
    @Autowired
    Environment env;
    
    @Bean
    public BlankDisc disc()
    {
        return new BlankDisc(env.getProperty("disc.title"), env.getProperty("disc.artist"));        // 檢索屬性值
    }
}  

@PropertySource在上述程序中引用了類路徑中的app.properties文件,該文件如下所示:

disc.title = Sgt.Peppers Lonely Hearts Club Band;
disc.artist = Beatles;
深入學習Spring的Environment

getProperty()方法有四個重載的變種形式:

String getProperty(String key)

String getProperty(String key, String defaultValue)

T getProperty(String key, Class type)

T getProperty(String key, Class type, T defaultValue)

如果使用getProperty()方法時沒有指定默認值,且該屬性無定義,那么獲取的值為null。如希望這個屬性必須要定義,那么可使用getRequiredProperty()方法,如下所示:

@Bean
public BlankDisc disc()
{
    return new BlankDisc(
        env.getRequiredProperty("disc.title"), env.getRequiredProperty("disc.artist")
    );
}

此時,若disc.title或disc.artist屬性無定義,將會拋出IllegalStateException異常。
如想檢查一下某個屬性是否存在,可以調用Environment的containsProperty()方法:

boolean titleExists = env.containsProperty("disc.title");

將屬性解析為類使用getPropertyAsClass()方法:

Class cdClass = env.getPropertyAsClass("disc.class", CompactDisc.class);

Environment檢查profile處于激活狀態的方法:

String[] getActiveProfiles():返回激活profile名稱的數組

String[] getDefaultProfiles():返回默認profile名稱的數組

boolean acceptsProfiles(String... profiles):如果environment支持給定profile的話,就返回true

解析屬性占位符

Spring一直支持將屬性定義到外部的屬性的文件中,并使用占位符值將其插入到Spring bean中。在Spring裝配中,占位符的形式為使用“${... }”包裝的屬性名稱。作為樣例,在XML中按照如下的方式解析BlankDisc構造器參數:

title構造器參數所給定的值是從disc.title屬性中解析得到的。artist參數裝配的是名為disc.artist的屬性值。按照這種方式,XML配置沒有使用任何硬編碼的值,它的值是從配置文件以外的一個源中解析得到的

如果依賴于組件掃描和自動裝配來創建和初始化應用組件,那么就沒有指定占位符的配置文件或類。這種情況下,可以使用@Value注解(與@Autowired注解相似)。如在BlankDisc類中,構造器可以改成如下所示:

public BlankDisc(
    @Value("${disc.title}")) String title,
    @Value("${disc.artist}")) String artist)
{
    this.title = title;
    this.artist = artist;
}

使用占位符必須要配置一個PropertyPlaceholderConfigurer bean或PropertySourcesPlaceholderConfigurer bean。從Spring3.1開始,推薦使用PropertySourcesPlaceholderConfigurer,因為它能夠基于Spring Environment及其屬性源來解析占位符

如下@Bean方法,在Java中配置了
PropertySourcesPlaceholderConfigurer:

@Beanocean[beanocean] 
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer()
{
    return new PropertySourcesPlaceholderConfigurer();
}

使用XML配置,Spring context命名空間中的元素將會生成PropertySourcesPlaceholderConfigurer bean:




使用Spring表達式語言進行裝配

Spring表達式語言(Spring Expression Language,SpEL)能夠以一種強大和簡潔的方式將值裝配到bean屬性和構造器參數中,在這個過程中所使用的表達式會在運行時計算得到值

SpEL擁有很多特性,包括:

使用bean的ID來引用bean

調用方法和訪問對象的屬性

對值進行算術、關系和邏輯運算

正則表達式匹配

集合操作

SpEL樣例

SpEL表達式要放到“#{ ... }”之中

#{T(System).currentTimeMillis()}

上述表達式的最終結果是計算表達式的那一刻當前時間的毫秒數。T()表達式會將java.lang.System視為Java中對應的類型,因此可以調用其static修飾的currentTimeMillis()方法

SpEL表達式也可以引用其他的bean或其他bean的屬性。如下表達式將計算得到ID為sgtPeppers的bean的artist屬性:

#{sgtPeppers.artist}

通過systemProperties對象引用系統屬性:

#{systemProperties["disc.title"]}

如通過組件掃描創建bean的話,在注入屬性和構造器參數時,可以使用@Value注解。如下面樣例展現BlankDisc從系統屬性中獲取專輯名稱和藝術家的名字:

public BlankDisc(
    @Value("${disc.title}")) String title,
    @Value("${disc.artist}")) String artist)
{
    this.title = title;
    this.artist = artist;
}

在XML配置中,可將SpEL表達式傳入的value屬性中,或者將其作為p-命名空間
或c-命名空間條目的值。如下BlankDisc bean的XML聲明中,構造器參數就是通過SpEL表達式設置的:

   
表示字面值

SpEL可以用來表示整數、浮點數、String值以及Boolean值

引用bean、屬性的方法

SpEL所能做的另外一件基礎的事情就是通過ID引用其他的bean

設有一個ID為artistSelector的bean,可在SpEL表達式中按照如下的方式來調用bean的selectArtist()方法:

#{artistSelector.selectArtist()}

對于被調用方法的返回值,同樣可以調用它的方法

#{artistSelector.selectArtist().toUpperCase()}

為了避免出現NullPointerException,可以使用類型安全的運算符:“?.”。這個運算符能夠在訪問它右邊的內容之前,確保它所對應的元素不是null。所以,如果selectArtist()的返回值是null的話,那么SpEL將不會調用toUpperCase()方法。表達式的返回值會是null:

#{artistSelector.selectArtist()?.toUpperCase()}    
在表達式中使用類型

如要在SpEL中訪問類作用域的方法和常量,要依賴T()這個關鍵的運算符。如為了在SpEL中表達Java的Math類,需要按照如下的方式使用T()運算符:

T(java.lang.Math)

這里所示的T()運算符的結果會是一個Class對象,代表了java.lang.Math。如果需要的話,我們甚至可以將其裝配到一個Class類型的bean屬性中。但是T()運算符的真正價值在于它能夠訪問目標類型的靜態方法和常量

如需要將PI值裝配到bean屬性中:

T(java.lang.Math).PI

調用T()運算符所得到類型的靜態方法。計算得到一個0到1之間的隨機數:

T(java.lang.Math).random()
SpEL運算符
運算符類型 運算符
算術運算 +、-、*、%、^
比較運算 <、>、==、<=、>=、lt、gt、eq、le、ge
邏輯運算 and、or、not、
條件運算 ?:(ternary)、?:(Elvis)
正則表達式 mathes
計算正則表達式 計算集合

SpEL中最令人驚奇的一些技巧是與集合和數組相關的

下述表達式會計算songs集合中第五個(基于零開始)元素的title屬性,這個集合來源于ID為musicBox bean:

#{musicBox.songs[4].title}

隨機選擇一首歌:

#{musicBox.songs[T(java.lang.Math).random()*timeless.songs.size()].title}   

“[]”運算符用來從集合或數組中按照索引獲取元素,還可以從String中獲取一個字符。如下表達式引用了String中的第9個字符,也就是"G":

#{"Nothing Gonna Change My Love For You"[8]}        

SpEL提供查詢運算符(.?[]),它會用來對集合進行過濾,得到集合的一個子集。作為闡述的樣例,假設你希望得到musicBox中artist屬性為Khalil的所有歌曲。如下的表達式就使用查詢運算符得到了Khalil的所有歌曲:

#{musicBox.songs.?[artist eq "Khalil"]}

SpEL還提供了另外兩個查詢運算符:“.^[]”和“.$[]”,它們分別用來在集合中查詢第一個匹配項和最后一個匹配項。例如,考慮下面的表達式,它會查找列表中第一個artist屬性為Khalil的歌曲:

#{musicBox.songs.^[artist eq "Khalil"]}

SpEL還提供了投影運算符(.![]),它會從集合的每個成員中選擇特定的屬性放到另外一個集合中。作為樣例,假設我們不想要歌曲對象的集合,而是所有歌曲名稱的集合。如下的表達式會將title屬性投影到一個新的String類型的集合中:

#{musicBox.songs.![title]}     

投影操作可以與其他任意的SpEL運算符一起使用。如可使用如下表達式獲得Khalil所有歌曲的名稱列表:

#{musicBox.songs.?[artist eq "Khalil"].![title]}  
 

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67346.html

相關文章

  • Spring - 高級裝配

    摘要:高級裝配條件化的自動裝配與歧義性的作用域表達式語言環境與可以為不同的環境提供不同的數據庫配置加密算法等注解可以在類級別和方法級別,沒有指定的始終都會被創建的方式配置不同環境所需要的數據庫配置會搭建一個嵌入式的數據庫模式定義在測試數據通過加 高級裝配 Spring profile 條件化的bean 自動裝配與歧義性 bean的作用域 Spring表達式語言 環境與profile p...

    binta 評論0 收藏0
  • Spring入門看這一篇就夠了

    摘要:甲乙交易活動不需要雙方見面,避免了雙方的互不信任造成交易失敗的問題。這就是的核心思想。統一配置,便于修改。帶參數的構造函數創建對象首先,就要提供帶參數的構造函數接下來,關鍵是怎么配置文件了。 前言 前面已經學習了Struts2和Hibernate框架了。接下來學習的是Spring框架...本博文主要是引入Spring框架... Spring介紹 Spring誕生: 創建Spring的...

    superw 評論0 收藏0
  • 手撕面試官系列(一):spring108道面試題合集

    摘要:解釋對象關系映射集成模塊。框架中的單例是線程安全的嗎解釋框架中的生命周期。什么是織入應用的不同點解釋基于方式的切面實現。 前言 想必各位程序員已經開始準備金九銀十的秋招了,創建這個這個系列文章的目的就是為了幫助大家解決面試的問題,系列文章將會一直更新,大家如果覺得不錯可以關注我并轉發,讓更多程序兄弟看到~接下來我們進入正文環節(面試題+答案領取方式見個人主頁) 基礎篇 Spring 概...

    AbnerMing 評論0 收藏0
  • Spring核心 裝配Bean

    摘要:它的構造器上添加了注解,這表明當創建的時候,會通過這個構造器來進行實例化并且會傳入一個可設置給類型的通過自動裝配,將一個注入到之中注解不僅能夠用在構造器上,還能用在屬性的方法上。 Spring配置的可選方案 Spring容器負責創建應用程序中的bean并通過DI來協調這些對象之間的關系。當描述bean如何進行裝配時,Spring具有非常大的靈活性,它提供了三種主要的裝配機制: 在XM...

    wanglu1209 評論0 收藏0
  • Spring高級裝配之運行時注入

    摘要:原文地址運行時注入與硬編碼注入是相對的。硬編碼注入在編譯時就已經確定了,運行時注入則可能需要一些外部的參數來解決。提供的兩種在運行時求值的方式屬性占位符表達式語言注入外部的值使用注解可以引入文件,使用其中的值。 原文地址:http://blog.gaoyuexiang.cn/Sp... 運行時注入與硬編碼注入是相對的。硬編碼注入在編譯時就已經確定了,運行時注入則可能需要一些外部的參數來...

    ZweiZhao 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<