1. 程式人生 > >spring的配置及ioc註解總結

spring的配置及ioc註解總結

目前都是用springboot來解決一些日常需求,有一段時間沒用springmvc了,在這裡總結一下,當作回顧。同時,springmvc也是java後臺的基礎,值得複習。

bean中的一些配置

scope配置應用場景:

1,action物件:必須是多例;

2,service物件:單例;

3,dao物件:單例

物件生命週期方法:

1,init-method: 初始化方法

2,destroy-method: 銷燬方法

springioc容器的依賴注入:

1,構造方法的注入 用constructor-arg

2,setter方法注入 用property

3,p名稱空間注入 配置xmlms:p="http://www.springframework.org/schema/p" p:customerDao-ref="customerDao" / p:name="eric" 但是前提是必須寫好set方法

4,spEL表示式:springEL表示式,語法變成#{} 例如<property name="customerDao" value="#{customerDao}"/>

注入不同資料型別:

1,普通資料型別 <value> 或者value屬性

2,javaBean物件:<ref>或者ref屬性

3,陣列:<array>

4,List集合:<list>

5:map集合:<map>標籤

6,Properties:<props>

如果是用ioc註解方式的話,需要在applicationContext.xml 中開啟下ioc註解功能,需要加入新的名稱空間,比如在beans中加入

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframwork.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

這樣就引入了context的名稱空間

然後配置下context的元件掃描

<!-- base-package: IOC註解的類所在的包 -->

<context:component-scan base-package="cn.z"/>

這時候只需要在類上加上@Component就能被ioc感知到,預設的類名是小寫字母開頭的。

當然也可以改那個名字,用name屬性就好。

ioc相關的註解:

@Component:建立物件(用於普通的spring專案)

@Repository:和@Component的作用是一樣的,都是用來建立物件(分層專案,Dao層)

@Service:和@Component的作用是一樣的,都是用來建立物件(分層專案,Service層)

@Controller:和@Component的作用是一樣的,都是用來建立物件(分層專案,web層)

@Scope:單例和多例,如果想要多例,可以在類上加@Scope("prototype")

//下面兩個方法要起作用,需要把類設計為單例

@PostConstruct:代替上文配置方式中的init-method

@PreDestroy:代表銷燬的方法

×註解方式可以代替xml方式進行ioc工廠。

依賴注入相關的註解:

@Value:注入普通資料型別,value的話很少直接寫,都是通過載入配置檔案的方式,在applicationContext.xml 中配一下<context:property-placeholder location="classpath:jdbc.properties"/> 就好,然後在實際程式碼中@Value("{url}")這樣引入外部的變數就好。

@Autowired:自動根據型別注入,autowired是注入一個物件,比如:

@Autowired

private CunstomerDao customerDao; // 直接就注入了,是直接賦值給變數,(無需提供構造方法或setter方法),底層直接走反射,賦值給customerDao

通俗來說就是他會去找誰實現了customerDao這個介面,然後看那些impl是不是配置了@Controller這樣的註解,如果配置了,就認為是夾在到ioc容器中了,然後就直接去取就行了。

注意:如果spring環境中沒有任何一個CustomerDao的型別,那麼會注入失敗。

如果spring環境中出現了多個impl實現了customerDao,比如第一個是@Contoller(value="customerDao1") 第二個是@Controller(value="customerDao2").....兩個impl ,將會失敗。

如果確實出現了這種情況怎麼辦? 這時候可以使用qulifer,他可以配合autowired使用名稱

@Qulifer:指定注入的物件名稱(也就是id)

使用:@Quelifier(value="customerDao2")

private CustomerDao customerDao;

@Resource:既能夠根據型別自動注入,也可以根據物件名稱自動注入

用法:如果有兩個實現類

@Resource(name="customerDao1")

private CustomerDao customerDao;

@Autowired和@Resource的區別:

1,注入的方式不一樣,autowired只能根據型別注入,如果需要根據名稱進行注入需要@Qualifier註解的配合,而@Resource既能夠根據型別自動注入,也可以根據物件名稱注入

2,所屬的標準不同

@Autowired來自於spring框架

@Resource來自javaee標準

所以說@Resource會比@Autowired更加標準

所以一般都是用resource註解來注入物件。

spring新註解(零配置註解)

用了這套註解,整個spring開發過程中不需要有任何xml檔案!

@Configuration

作用:配置類,用於代替applicationContext.xml 檔案

例如寫一個配置類,上面寫@Configurable

@ComponentScan

作用:代替<context:component-scan/>標籤

例如@ComponentScan(basePackages={"cn.sm1234"}

這時候在啟動程式中就需要ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);

@PropertySource

作用:代替<context:property-placeholder/>配置,載入properties配置檔案

用的時候可以在SpringConfig配置類前寫@PropertySource(value="classpath:jdbc.properties")

然後在需要用的service類中用@Value("${url}")類引用

@import

如果有很多配置類,那麼可以在主配置類中引用其他配置類,@Import(value={JdbcProperties.class})

@Bean

作用:把一個物件放入springioc容器

用法:比如我在service層要get一個Dao,但是這時候這個dao是不在ioc容器中的。

這時候可以這麼做:

@Bean(name="custDao")

public CustomerDao getDao(){

    return new CustomerDaoImpl(();

}

這樣@Bean就有兩個作用,一個是可以執行該方法的程式碼,第二個是把該方法的返回物件放入Spring的IOC容器中。

注意@Bean必須是用在方法的頂部,不能用在類上面

@Bean和@Resource或@Autowired的區別

後者是從springioc容器中獲取一個指定型別或者指定名稱的物件。前者是執行某個方法,把方法的返回的物件,放入spring的ioc容器。

spring可以整合junit進行簡化測試類編寫。

倒入spring-test包

有配置檔案的方式

在測試類上寫:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

然後在測試類中想拿dao的一個物件直接這樣寫就好了

@Resource

private CustomerDao customerDao;

這樣就已經注入了Dao

這一junit版本不要太低。。不然回報錯。要是用eclipse開發,就替換eclipse的低版本。

零配置的方式

同樣也是在測試類上寫:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(classes={SpringConfig.class})

然後注入是和之前是一樣的

@Resource(name="customerDao1")

private CustomerDao customerDao;