天天看點

spring依賴注入使用方法和注解的使用

依賴注入DI(Dependency Injection)的三種注入方法使用介紹

set方法

構造方法

注解法

1、使用set方法注入

如下圖中UseService檔案依賴Userdao對象,可以通過setUserDao11函數設定注入

spring依賴注入使用方法和注解的使用

配置檔案使用property标簽配置注入内容

注意:配置檔案中name參數的值取至set方法後跟的内容同時首字母小寫

例如:set方法名是setUserDao111,那麼name的值就是userDao111。

spring依賴注入使用方法和注解的使用

2、使用有參構造函數注入

spring依賴注入使用方法和注解的使用

有參構造函數注入使用constructor-arg标簽name是要注入的構造函數的參數名

spring依賴注入使用方法和注解的使用

如果注入的内容是引用類型,就使用‘ref=’給對象指派,且對象的值必須是在配置檔案中注冊過的的對象id,如本文中的userServiceId和userDaoId,如果注入内容是普通資料類型,就使用‘value=’指派,賦的值可以是任意值,無需提前注冊。

3、使用注解注入

使用注解方法時不需要在配置檔案中添加各個要注入的内容,而是在配置檔案中配置元件掃描即可,源檔案也不在需要定義set方法,構造方法。

在配置檔案中添加如下語句,即可讓spring掃描com.syx.dao包下的所有注解,否則spring無法識别你注解的内容

具體注解方法如下:

spring依賴注入使用方法和注解的使用
// 使用Component添加id為userServiceId的注解相當于配置檔案執行了
// <bean id="userServiceId" class="com.syx.dao.service.UserService"/>
@Component("userServiceId")
public class UserService {
	// Autowired和Qualifier組合作用是按照名稱進行注入,使用相當于
	// <constructor-arg name="userdaoparam" ref="userDaoId"></constructor-arg>
    @Autowired
    @Qualifier("userDaoId")
    private UserDao userdaoparam;

	// Value是按照值進行注入,相當于
	// <property name="test_a" value="13"></property>
	// 注解中的值可以是${...}表達式
    @Value("13")
    private int test_a;

    public void test() {
        System.out.println("注入值是" + test_a);
        userdaoparam.test();
    }
}

---------分界線----------以下是作為一個配置類常用的注解------------------


// 标志該類是spring的核心配置類
@Configuration
// 配置元件掃描包
// 相當于配置檔案中的<context:component-scan base-package="com.syx.dao"></context:component-scan>
@ComponentScan("com.syx.dao")
// 加載資源配置檔案jdbc.properties
// 相當于配置檔案中的 <context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("claspath:jdbc.properties")
// 加載其他配置類,可加載多個,使用逗号分隔
// 相當于配置檔案中的 <import resource="xxx"/>
@Import({XXXX.class, YYY.class, ZZZ.class})
public class SpringConfig {
    @Value("${jdbc.driver}")
    private String driver;
    
    // Spring 會把目前方法的傳回值以指定名稱dataSourceName存儲到容器中
    @Bean("dataSourceName")
    public DataSource getDataSource() {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.SetDriverClass(driver);
        ...
        ...
        ...
        return dataSource;
    }
}
           

4、常用配置檔案注入XML标簽使用示例

<bean id="userServiceId" class="com.syx.dao.service.UserService">
        <property name="userDao11" ref="userDaoId"></property>
        <!-- test_a 是int類型資料注入值100 -->
        <property name="test_a" value="100"></property>
        
        
		<!-- strList是List<String>集合,使用如下方法給集合添加兩個成員aaa和bbb -->
		<property name="strList">
			<list>
				<value>aaa</value>
				<value>bbb</value>
				<!-- 如果集合List存儲的是引用類型資料 需改用ref标簽指派,如下
				<ref bean="userDaoId"></ref>
				-->
			</list>
		</property>


		<!-- userMap是Map<String, String>類型資料 -->
		<property name="userMap">
			<map>
				<entry key="adc" value="def"></entry>
				<!-- 如果Map的鍵值對均為引用類型,那麼要使用如下标簽進行注入
				<entry key-ref="adc" value-ref="def"></entry>
				-->
			</map>
		</property>

		<!-- properties是一個Properties類型資料 -->
		<property name="properties">
			<props>
				<prop key="adc">123456</prop >
				<prop key="adc">fkgj</prop >
			</props>
		</property>


    <!-- 配置元件掃描包 當類中使用注解時需要配置此标簽掃描注解 -->
    <context:component-scan base-package="com.syx.dao"></context:component-scan>
    <!-- 加載其他配置檔案 -->
	<import resource="">


    </bean>
           

5、注解詳解

spring依賴注入使用方法和注解的使用

1、@Component和@Controller、@Service、@Repository三個注解功能完全一緻,隻不過後三個一般分别用于web層,service層和dao層,更能起到表意作用。

2、@Autowired用于字段的依賴注入,當spring容器中隻有某類的一個bean時,可以單獨使用。

  @Qualifier結合@Autowired按名稱給字段注入

  @Resource(name = “bean_id”)相當于@Qualifier和@Autowired(“bean_id”)配合使用

3、@Value 注入普通值屬性,通常Value的值會使用${…}表達式

4、@Scope 設定bean是僅建立單個對象還是可以建立多個對象。

5、@PostConstruct設定bean的初始化方法,作用等同于配置檔案中的init-methond="…"

  相關函數執行順序:

  注解類構造函數Constructor -> @Autowired -> @PostConstruct

6、@PreDestroy設定bean的銷毀方法,作用等同于配置檔案的destory-methond="…"

spring依賴注入使用方法和注解的使用

用法見第三小節示例