Spring核心系列之Bean的注入

Spring核心系列之Bean的注入

Hello,你們好,上兩篇博文給你們分享了Spring容器的建立,以及Bean的生命週期,今天這一篇給你們講解Bean的注入,就是Bean的一些注入方式,配置方式,而後再講一下做者的一點使用經驗,其實這一篇也是比較基礎的東西,好了,老套路,文章結構:java

  1. 基於XML的配置
  2. 基於註解的配置
  3. 基於Spring config 的配置
  4. 幾種配置方式的混合使用

1. 基於XML的配置

單單這一小節,若是往細了說,一篇博文都是不夠的,由於知識點比較多,比較雜,並且,絕大部分都是一生用不上的。因此我想了想,仍是直接乾脆直接的上重點,不少不用的能提就提一下。程序員

1.1 DTD格式

Spring的XML配置文件是DTD格式的,不少人其實對這個XML的開頭一些配置都不理,我這裏仍是提一下: web

Beans標籤的格式:
<Beans xmlns屬性 xmlns屬性 ... xsi屬性>redis

  • xmlns屬性定義命名空間,命名空間就是全部文件定義bean時帶的前綴,像aop:config,這個標籤的aop就是aop命名空間 ,沒有加命名空間,就是默認的命名空間.bash

  • xsi屬性是根據全限定名稱指定格式文件xsd的.框架

  • xmlns屬性的格式:xmlns:命名空間="命名空間的全限定名(能夠隨意命名,命爲123均可以)"ide

  • xsd 格式: "xmlns定義的命名空間"+"空格"+"xsd文件"函數

說下指定xsd的做用:當你敲下 的前半段<bea,它個你提示出所有的 。 其實這個就是ide根據xsd文件幫你列出來的。spa

1.2 定義Bean

在xml文件裏定義Bean,賊簡單的一個:code

<bean id="stu" class="com.zdy.Student" >
    <property name="name"><value>張三</value></property>
</bean>
複製代碼

是根據setter方法注入的。你們不要在看什麼根據構造函數注入屬性了。西壩,博主這麼多年都沒有過這種操做。都是根據setter注入的。 而後說一下,XML裏面有一些特殊字符,要使用轉義序列代替,我給個表格:

至於網上說的還有一種:<![CDATA[]]>的搞法,你們忽略掉。一是不方便,二是不支持p命名空間。待會會說到p命名空間.

上面的例子是注入的常量,而後提下bean之間的相互依賴:

<bean id="car" calss="..." />
<bean id="boss" class="..." >
    <property name="car">
        <ref bean="car"></ref>
    </property>
</bean>
複製代碼

其餘的一些什麼集合注入,級聯注入,我就不提了,根本沒地用。

1.3 xml簡化配置之p命名空間

上面的配置你們能夠看到,賊複雜,並且在配置bean之間的相互依賴關係時還要使用ref標籤。如今來給你們說下簡化配置方式,和自動注入. p命名空間是Spring2.5以後提供的,目的就是爲了簡化配置,看下效果:

//使用前
<bean id="stu" class="com.zdy.Student" >
    <property name="name"><value>張三</value></property>
</bean>
//使用後
<bran id="stu" class="..." p:name="張三" />
複製代碼

而後說下格式:

  • 對於字面常量: p:屬性名=".."
  • 對於引用bean的屬性: p:屬性名-ref="..."

而後提一下自動注入:你們能夠看到若是使用ref標籤來注入bean依賴,程序員會死掉的。好比一個Controller層的Bean,依賴的Service層的Bean可能有10幾個。一個個的配置了寫。確定是不行的。因此自動注入就出來了。@Autowired註解,後面會講。這裏只是提一下.

而後提一下,標籤,用於導入多個xml配置文件到一個xml配置文件中.

2. 基於註解的配置

上面能夠看到,想把Bean注入到Spring容器中,可使用標籤,而後注入一些屬性什麼的。而且bean之間的引用關係可使用ref標籤。其實工做中這種操做基本沒有公司會採納的。由於太麻煩了,因爲是配到ref標籤時,真的會死人的。工做中,對於咱們本身建立的bean,確定是會使用註解的方式來配置的,具體使用方法:

  1. 在xml文件中或者Java config類中加上掃描路徑,這裏說下xml的配置:
<context:component-scan base-package="...">
複製代碼
  1. 咱們本身寫的bean上面加上@Component,@Controller,@Service,@Dao
@Component
public class UerDao {
    ...
}
複製代碼

這樣,咱們的UserDao就注入到了Spring容器中。那麼這種配置方式是如何解決相互依賴關係呢?@AutoWired

@Controller
public class UserController{
    @Autoired
    private UserService userService;
    ...
}
複製代碼

@Autoired會自動根據類型來把Bean注入進來。這多簡單呢?至於一些其餘的參數,我就不擴展了。

3. 基於Spring config 的配置

直接給一個Config類:

@Configuration
public class UserJedisConfig {

    @Bean
    public CacheManager cacheManager(final RedisTemplate redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate2(final RedisConnectionFactory factory) {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new RedisObjectSerializer());
        template.afterPropertiesSet();
        return template;
    }
}
複製代碼

@Configuration 內部包含了@Component,說白了,當這個Bean加入到Spring容器中時,它內部標註了@Bean的方法返回的Bean都會放到Spring容器中。 具體的語法我很少說了。 @Configuration類想加入到Spring容器中有三種方式,一種是在xml裏經過<context:component-scan base-package="...">掃描。一種是經過其餘的Config類加上@Componentscan註解,做用是同樣的,掃描配置路徑下的POJO ,最後一種是在建立容器的時候直接指定這個config類,而不是xml配置文件,前面的博客講到過。

4. 幾種配置方式的混合使用

好了,其實想把Bean加入到Spring容器中的方法無非是以上三種。並且也都很基礎。我說下實際工做當中的一些小經驗:

  1. 註解大於xml配置。你們本身也能夠感受到註解的方便。
  2. 本身寫的bean所有使用註解來注入到容器中。至於容器啓動的時候是使用xml文件仍是Config類,這都無所謂。只要加了自動掃描便可。
  3. 集成一些三方的框架(如Jedis),須要放入三方的bean到Spring容器中時,這時候沒辦法使用註解,可使用xml文件配置或者config類配置。

最後給一個比較圖,和使用場景圖:

最後說一下,做者遇到過的實際的這幾種方式的選擇:

  1. 以前在某家房地產公司用到的是"XML+註解",這種方式仍是比較多見,比較傳統的。Web項目,容器啓動以來一個xml文件,而後xml文件中配置掃描的跟路徑,本身寫的Bean放在路徑下面並加上相似於@Componenet的註解,依賴關係依賴於@Autowired註解。若是引用了一些三方的框架,想使用一些框架自帶的Bean,就在xml中配置標籤加到容器裏面去。這是比較傳統的Spring容器使用方式。
  2. Spring boot,用過或者瞭解過Spring boot的小夥伴應該知道,Spring boot中是沒有xml文件的,容器啓用依賴一個自帶的config類,這個config類會自動掃描跟路徑之下的,因此咱們開發的類只要加上了@Component相似的註解都會被加入到容器當中。依賴一些三方的框架的Bean,通常狀況下,Spring boot會有一些auto注入機制,自動根據配置的參數建立Bean並自動注入bean到容器中。開發者直接@Autowired就可使用。特殊狀況下才會本身寫一個config類來注入一下Spring boot沒有自帶的三方bean。爲何用過Spring boot的小夥伴都以爲Spring boot比較簡潔呢?你想想,若是你要使用Jedis,只須要pom引入便可。而後就直接@Autowired注入相應的bean,根本不須要配置。這也是Spring boot最最核心的一個特點。後期有機會講Spring boot時給你們分享這種自動注入是如何實現的。

結語

好了,其實這一小節比較簡單,你們能夠看到,做者沒有講具體太細的使用方法,像@Autowired的一些屬性,@Configuration的一些語法什麼的,做者都是一筆帶過,給了個例子,由於做者以爲這一篇的重點應該是把握好這幾種注入Bean的機制,舉幾個例子:

  1. 開發者在本身的工程中看到了寫的bean被加上了@Component註解,要能知道這個bean是怎麼被加進來的(是xml掃描,仍是config文件掃描),
  2. 接到工程發現web工程居然沒有Spring的XML主文件。(這時候就要想到是否是經過Config類來啓動的容器)
  3. 開發者想加入一些三方的Bean到容器裏,是使用xml配置,仍是使用config類配置。 好了,這一篇給你們分享完了,今天週一,你們鼓足幹勁,好好上班,賺錢過年回家。Over,Hava a good day .
相關文章
相關標籤/搜索