Hello,你們好,上兩篇博文給你們分享了Spring容器的建立,以及Bean的生命週期,今天這一篇給你們講解Bean的注入,就是Bean的一些注入方式,配置方式,而後再講一下做者的一點使用經驗,其實這一篇也是比較基礎的東西,好了,老套路,文章結構:java
單單這一小節,若是往細了說,一篇博文都是不夠的,由於知識點比較多,比較雜,並且,絕大部分都是一生用不上的。因此我想了想,仍是直接乾脆直接的上重點,不少不用的能提就提一下。程序員
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
在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>
複製代碼
其餘的一些什麼集合注入,級聯注入,我就不提了,根本沒地用。
上面的配置你們能夠看到,賊複雜,並且在配置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="張三" />
複製代碼
而後說下格式:
而後提一下自動注入:你們能夠看到若是使用ref標籤來注入bean依賴,程序員會死掉的。好比一個Controller層的Bean,依賴的Service層的Bean可能有10幾個。一個個的配置了寫。確定是不行的。因此自動注入就出來了。@Autowired註解,後面會講。這裏只是提一下.
而後提一下,標籤,用於導入多個xml配置文件到一個xml配置文件中.
上面能夠看到,想把Bean注入到Spring容器中,可使用標籤,而後注入一些屬性什麼的。而且bean之間的引用關係可使用ref標籤。其實工做中這種操做基本沒有公司會採納的。由於太麻煩了,因爲是配到ref標籤時,真的會死人的。工做中,對於咱們本身建立的bean,確定是會使用註解的方式來配置的,具體使用方法:
<context:component-scan base-package="...">
複製代碼
@Component
public class UerDao {
...
}
複製代碼
這樣,咱們的UserDao就注入到了Spring容器中。那麼這種配置方式是如何解決相互依賴關係呢?@AutoWired
@Controller
public class UserController{
@Autoired
private UserService userService;
...
}
複製代碼
@Autoired會自動根據類型來把Bean注入進來。這多簡單呢?至於一些其餘的參數,我就不擴展了。
直接給一個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配置文件,前面的博客講到過。
好了,其實想把Bean加入到Spring容器中的方法無非是以上三種。並且也都很基礎。我說下實際工做當中的一些小經驗:
最後給一個比較圖,和使用場景圖:
最後說一下,做者遇到過的實際的這幾種方式的選擇:
好了,其實這一小節比較簡單,你們能夠看到,做者沒有講具體太細的使用方法,像@Autowired的一些屬性,@Configuration的一些語法什麼的,做者都是一筆帶過,給了個例子,由於做者以爲這一篇的重點應該是把握好這幾種注入Bean的機制,舉幾個例子: