Spring註解方式 實現 IOC 和 DI

代碼不是看出來的,而是敲出來的,歡迎關注WX公眾號【禿頭程序員】,收藏教程。

1.註解概念

所謂註解就是給程序看的提示信息,很多時候都用來作為輕量級配置的方式。

關於註解的知識點,參看java基礎課程中java基礎加強部分的內容。

2.Spring中的註解

Spring除了默認的使用xml配置文件的方式實現配置之外,也支持使用註解方式實現配置,這種方式效率更高,配置信息清晰,修改更方便,推薦使用。

引入context名稱空間:

在MyEclipse中導入spring-context-3.2.xsd約束文件,要求Spring來管理。

在applicationContext.xml文件中,引入該schema文件:

<code>
<beansxmlns>xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">

**可以將以上頭信息加入MyEclipse模版,方便後續自動生成。/<beansxmlns>/<code>

3.使用類註解

使用Spring的類註解可以通過註解註冊類為bean,省去了配置文件中的<bean>配置。 /<bean>

  1. 開啟包掃描

在spring的配置文件中,開啟包掃描,指定spring自動掃描哪些個包下的類。

<code><component-scanbase-package>
/<component-scanbase-package>/<code>

案例:

<code>
<beansxmlns>xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">

<component-scanbase-package>

/<component-scanbase-package>/<beansxmlns>/<code>

b.使用註解註冊bean

這個包中的類會在spring容器啟動時自動被掃描,檢測是否需要自動配置為bean.

在配置的包中的類上使用@Component註解,則這個類會自動被註冊為bean,使用當前類的class為<bean>的class,通常情況下使用類名首字母小寫為<bean>id。/<bean>/<bean>

案例:

<code>import org.springframework.stereotype.Component;
@Component
public class Person{
}/<code>

c.bean的id

可以使bean類實現BeanNameAware接口,並實現其中的setBeanName方法,spring容器會在初始化bean時,調用此方法告知當前bean的id。通過這個方式可以獲取bean的id信息。

通常情況下註解註冊bean使用類名首字母小寫為bean的id,但是如果類名的第二個字母為大寫則首字母保留原樣.

<code> <bean>cn.tedu.beans.NBA -->
<bean>/<code>

也可以通過在@Component中配置value屬性,明確的指定當前類在註冊到spring時bean的id

案例:

<code>import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("per")
public class Person implements BeanNameAware{
@Override
public void setBeanName(String name) {
System.out.println("==="+this.getClass().getName()+"==="+name);
}
}/<code>

4.使用屬性註解

使用屬性註解,可以為bean配置屬性的注入過程,省去了在配置文件中進行注入配置的過程,更加便捷。

a.在配置文件中開啟屬性註解功能

<code>
<beansxmlns>xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">

<annotation-config>
/<beansxmlns>/<code>

b.使用屬性註解注入bean類型數據:

在bean中的屬性上通過如下註解聲明屬性注入

@Autowired

也可以使用@Qualifier(value="dog1")註解,明確的指定,要注入哪個id的bean

代碼:

<code>import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
public class Person implements BeanNameAware{
@Autowired
private Dog dog;
@Autowired
private Cat cat;
public Dog getDog() {
return dog;
}
public void setDogx(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "Person [dog=" + dog + ", cat=" + cat +"]";
}
@Override
public void setBeanName(String name) {
System.out.println("=============="+this.getClass().getName()+"===="+name);
}
}/<code>

c.屬性注入bean類型數據的原理:

當spring容器解析xml時,發現開啟了屬性註解,則會在創建bean時,檢測屬性上是否存在@Autowired註解,如果發現該註解,則會通過當前屬性的名稱尋找是否存在該id的bean,如果存在則注入進來,如果不存在,再檢查是否存在和當前屬性類型相同的bean,如果由則注入進來,如果都沒有則拋出異常.

也可以使用@Resource(name="id")指定注入給定id的bean,但是這種方式不建議大家使用。

d.spring內置支持注入類型的註解方式的注入 - 非集合類型

spring中可以通過註解方式註冊bean,並可以通過@Autowired實現屬性的自動注入,但注入的都是自定義的bean類型,如果類中包含例如 int longString等spring內置可注入的類型時,又該如何注入呢?可以使用@Value註解來實現注入。

<code>
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("per")
public class Person implements BeanNameAware{
@Value("999")
private int id;
@Value("zs")
private String name;
@Autowired
private Dog dog;
@Autowired
private Cat cat;

public Dog getDog() {
return dog;
}
public void setDogx(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override

public String toString() {
return "Person [id=" + id + ", name=" + name +", dog=" + dog
+ ", cat=" + cat + "]";
}
@Override
public void setBeanName(String name) {
System.out.println("==="+this.getClass().getName()+"==="+name);
}
}/<code>

這種方式可以實現spring內置類型的注入,但是這種方式將注入的值寫死在了代碼中,後續如果希望改變注入的初始值,必須來修改源代碼,此時可以將這些值配置到一個properties配置文件中,再在spring中進行引入。

代碼不是看出來的,而是敲出來的,歡迎關注WX公眾號【禿頭程序員】,收藏教程。


分享到:


相關文章: