1. 程式人生 > >Spring IOC註解的快速入門

Spring IOC註解的快速入門

1.1.建立Java工程並匯入jar包
maven配置:

 <dependencies>

	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>4.2.4.RELEASE</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aop</artifactId>
	    <version>4.2.4.RELEASE</version>
	</dependency>
	
  </dependencies>

spirng 整合junit ,程式中引入spring-test.jar

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.2.4.RELEASE</version>
    <scope>test</scope>
</dependency>

1.2.建立包結構並編寫Java類
1.UserService介面

package com.icbc.study.service;

public interface UserService {

	/**
	 * 業務層:使用者儲存
	 */
	public void save();
}

2.UserServiceImpl實現類
在Java類上添加註解
在UserServiceImpl實現類上添加註解@Service,相當於,value屬性給bean指定id,value屬性的名字也可以不寫,直接寫一個值

import org.springframework.stereotype.Service;

import com.icbc.study.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

	@Override
	public void save() {
		System.out.println("業務層:使用者儲存");
	}

}

3.在applicationContext.xml中引入約束.
src目錄下,建立applicationContext.xml的配置檔案,引入約束。注意:因為現在想使用註解,那麼需要context的約束。

4.在applicationContext.xml中開啟註解掃描.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
      <!-- 開啟註解掃描 -->
      <context:component-scan base-package="com.icbc.study.service"></context:component-scan>
      
</beans>

5.編寫測試程式碼

package com.icbc.study.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.icbc.study.service.UserService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Testt {
	@Autowired
	private UserService userService;
	
	@Test
	public void test1(){
		userService.save();
	}
}

2.Spring框架中bean管理的常用註解.
A.(建立物件的)
[email protected]註解
作用:
把資源讓spring來管理。相當於在xml中配置一個bean。
屬性:
value:指定bean的id。如果不指定value屬性,預設bean的id是當前類的類名。首字母小寫。
[email protected] @Service @Repository
他們三個註解都是針對一個的衍生註解,他們的作用及屬性都是一模一樣的。
他們只不過是提供了更加明確的語義化。
@Controller:一般用於表現層的註解。
@Service:一般用於業務層的註解。
@Repository:一般用於持久層的註解。

B.2.2.用於注入資料的

相當於:<property name="" ref=""> <property name="" value="">

[email protected]
作用:
注入基本資料型別和String型別資料的
屬性:
value:用於指定值
[email protected](重點)
作用:
自動按照型別注入。當使用註解注入屬性時,set方法可以省略。它只能注入其他bean型別。當有多個型別匹配時,使用要注入的物件變數名稱作為bean的id,在spring容器查詢,找到了也可以注入成功。找不到就報錯.

package com.icbc.study.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.icbc.study.dao.UserDao;
import com.icbc.study.service.UserService;

@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;
	@Value("張三")
	private String name;
	@Override
	public void save() {
		System.out.println("業務層:使用者儲存");
		System.out.println("使用者名稱:" + name);
		userDao.save();
	}

}

[email protected]
作用:
在自動按照型別注入的基礎之上,再按照Bean的id注入。它在給欄位注入時不能獨立使用,必須和@Autowire一起使用;但是給方法引數注入時,可以獨立使用。
屬性:
value:指定bean的id。
1.建立UserDao介面的第二個實現類UserDaoImpl2

@Repository("userDaoImpl2")
public class UserDaoImpl2 implements UserDao {

	@Override
	public void save() {
		System.out.println("持久層2:儲存使用者");
	}

}

2.測試發現,UserServiceImpl中注入的還是第一個UserDaoImpl,想指定注入UserDaoImpl2,需要使用@Qualifier註解根據名字來注入

@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("張三")
	private String name;
	@Override
	public void save() {
		System.out.println("業務層:使用者儲存");
		System.out.println("使用者名稱:" + name);
		userDao.save();
	}

}

@Resource
作用:
直接按照Bean的id注入。它也只能注入其他bean型別。
屬性:
name:指定bean的id。

C.
2.3.用於改變作用域範圍的
[email protected]
作用:
指定bean的作用範圍。
屬性:
value:指定範圍的值。
取值:singleton prototype request session globalsession.
例如:

@Service("userService")
@Scope("singleton")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("張三")
	private String name;
	@Override
	public void save() {
		System.out.println("業務層:使用者儲存");
		System.out.println("使用者名稱:" + name);
		userDao.save();
	}

}

測試方法。

@Service("userService")
@Scope("singleton")
public class UserServiceImpl implements UserService {

	@Autowired
	@Qualifier("userDaoImpl2")
	private UserDao userDao;
	@Value("張三")
	private String name;
	@Override
	public void save() {
		System.out.println("業務層:使用者儲存");
		System.out.println("使用者名稱:" + name);
		userDao.save();
	}

}

修改scope中的值,兩次執行的結果是不一樣的。

D.
和生命週期相關的 相當於:

<bean id="" class="" init-method="" destroy-method="" />

@PostConstruct
@PostConstruct加在方法上,指定bean物件建立好之後,呼叫該方法初始化物件,類似於xml的init-method方法

@PreDestory註解
@PreDestory加在方法上,指定bean銷燬之前,呼叫該方法,類似於xml的destory-method方法

3.XML和註解的比較
註解的優勢:
配置簡單,維護方便。(我們找到了類,就相當於找到了配置)
XML的優勢:
修改時,不用改原始碼。不涉及重新編譯和部署。
Xml和註解的比較
在這裡插入圖片描述