Spring中註解注入bean和配置檔案注入bean
阿新 • • 發佈:2018-11-06
註解的方式確實比手動寫xml檔案注入要方便快捷很多,省去了很多不必要的時間去寫xml檔案
按以往要注入bean的時候,需要去配置一個xml,當然也可以直接掃描包體,用xml注入bean有以下方法:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 4xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 7 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 11 12 <!-- 這個就是springmvc裡面的包掃描,只要是家了@Controller,@Service之類的,都會自動掃描並加入註冊 --> 13 <context:component-scan base-package="com.lx.springmvcdemo" use-default-filters="false"></context:component-scan> 14 15 16 <!-- 這個就是spring裡面的bean註冊,scope是告訴spring是用什麼模式,是單例還是工廠或者request或者session等 -->
17 <bean id="person" class="com.lx.springmvcdemo.bean.Color" scope="prototype"> 18 <property name="yellow" value="yellow"></property> 19 <property name="red" value="red"></property> 20 </bean> 21 22 <bean ></bean> 23 24 <!-- 開啟基於配置的的AOP --> 25 <aop:aspectj-autoproxy ></aop:aspectj-autoproxy> 26 </beans>
可以看到,如果是手動注入bean的話,需要配置很多東西,比如採用的模式,包的路徑,id,預設屬性值等等,但用註解,可以省略很多,而且更加靈活
首先我們先建立一個普通的類:
package com.lx.springmvcdemo.bean; public class Color { private String yellow; public Color(String yellow, String red) { super(); this.yellow = yellow; this.red = red; } public Color() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "Color [yellow=" + yellow + ", red=" + red + "]"; } public String getYellow() { return yellow; } public void setYellow(String yellow) { this.yellow = yellow; } public String getRed() { return red; } public void setRed(String red) { this.red = red; } private String red; }
然後做一個配置類,我們起個名字叫MainConfig
package com.lx.springmvcdemo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import com.lx.springmvcdemo.bean.*; import com.lx.springmvcdemo.condition.LinuxCondition; import com.lx.springmvcdemo.condition.WindowCondition; //類中組建統一設定,這個conditional裡面的是一個數組,只有滿足這個條件,這個類裡面的bean才會生效 //@Conditional({WindowCondition.class}) @Configuration //快速匯入元件的註解,import,可以使用單個,也可以使用陣列,這樣就會自動匯入這個元件 //{Color.class,Red.class,MyImportSelecter.class,MyImportBeanDefinitionRegistart.class} @Import({Blue.class}) public class MainConfigII { /*Scope,設定元件作用域 * * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE * @see ConfigurableBeanFactory#SCOPE_SINGLETON * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION * prototype:多例項,ioc啟動的時候,並不會去新增這個person物件,而是在每次呼叫的時候new一次 * singleton:單例項,也是預設值,會一直使用同一個 * request:同一次請求建立一個例項 * session:同一個session建立一個例項 * * * @lazy * 懶載入: * 只針對單例項bean,預設容器啟動的時候建立bean * 而懶載入則是,容器啟動的時候不建立物件,而是第一次使用時候 * 建立物件並初始化 * * */ //@Scope("singleton")//這個確定是單例還是多例項 // @Lazy ///這個就是懶載入 // @Bean("person") // public Person person() { // System.out.println("啟動,新增person類"); // return new Person("aj",33); // } /*** * Conditional:按照條件註冊bean * 這個conditional也可以註冊到類上面 * 意思也是一樣,就是滿足conditional這個註解裡面的條件,這個類下面的所以bean才會生效 * @return */ /*** * 給容器中註冊元件的註解 * 1),@Bean():就像下面所演示的一樣 * 2),@import():可以快速匯入不需要操作很複雜的元件,可以直接用陣列批量匯入 * 其中,ID是預設的全類名 * ImportSelector:自定義返回bean,陣列, * importBeanDefinitionRegistart:手動註冊bean到容器裡面 * * 3),直接掃描某一個包下面的全部bean * 4),FactoryBean,這個是spring提供的工廠bean * 1),預設獲取呼叫的是bean呼叫getObject()的物件 * 2),要獲取工廠本身的話,可以用&ColorFactoryBean來獲取,即&加上bean的ID * @return */ @Bean public Color Color() { return new Color(); } }
以上程式碼裡面都有很詳細的註釋
然後可以直接建立一個測試類
@Test public void test02() { // ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml"); //通過AnnotationConfigApplicationContext獲取配置檔案 //然後通過bean的ID 獲取bean ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfigII.class); Color c= (Color) applicationContext.getBean("Color"); System.out.println(c.toString()); // Person person2=(Person) applicationContext.getBean("person"); //System.out.println(person==person2); }
以上。