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和註解的比較