重要性:IoC是Spring框架的控制反轉容器。
spring官方文檔核心技術第一節概述就是講解Ioc容器
IoC實質:
容器通過讀取配置元數據來獲取有關要實例化,配置和組裝哪些對象的指令。
下面就具體的操作了解IoC容器
1.先寫一個UserDao接口
public interface UserDao {
public void getUser();
}
2.再去寫Dao的實現類
public class UserDaoImpl implements UserDao {
public void getUser() {
System.out.println("獲取默認數據!");
}
}
3.然後寫一個UserService接口
public interface UserService {
public void getUser();
}
4.最後寫Service實現類
public class UserServiceImpl implements UserService {
private UserDaoImpl userDao = new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
5.測試:
public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
假設我們現在以下幾個Dao的實現類。如果要使用任意一個
public class UserDaoMysqlImpl implements UserDao{
public void getUser() {
System.out.println("獲取Mysql的數據!");
}
}
public class UserDaoOracleImpl implements UserDao {
public void getUser() {
System.out.println("獲取Oracle的數據!");
}
}
public class UserDaoServerImpl implements UserDao {
public void getUser() {
System.out.println("獲取Server的數據!");
}
}
問題
:如果我們要使用任意一個實現類會比較繁瑣 每次都要修改代碼,根據使用的對象,每次的對象也不同。如何解決呢?不放試試set注入
只需要修改Service接口、測試類代碼如下:
public class UserServiceImpl implements UserService {
private UserDao userDao;
//這裏的set方法可以比較java的set方法,只不過傳進去的參數是一個對象而已,需要對象那麼在測試的時候我們就new 對象
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
//setUserDao();參數是使用的那個類
userService.setUserDao(new UserDaoServerImpl());
userService.getUser();
}
}
set注入個人的一些解釋:
場景:兩個座標進行相加,判斷用戶傳入的參數可能都是什麼?
public class Point {
private int row;
private int col;
//有參構造方法
public Point(int row, int col) {
this.row = row;
this.col = col;
}
//調用自身的有參構造方法
public Point() {
this(0, 0);
}
public Point(Point point) {
this.col=point.getCol();
this.row=point.getRow();
}
public Point(Point point1, Point point2) {
this.row=(point1.getRow()+point2.getRow());
this.col=(point1.getCol()+point2.getCol());
}
public Point(int row) {
this.row=row;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public Point add(int row, int col, int row1, int col1) {
Point point = new Point();
point.setRow(row+row1);
point.setCol(col+col1);
return point;
}
public Point add(Point point1, Point point2) {
Point pt = new Point();
pt.setRow(point1.getRow()+point2.getRow());
pt.setCol(point1.getCol()+point2.getCol());
return pt;
}
public Point add(Point point) {
this.setCol(point.getCol());
this.setRow(point.getRow());
return point;
}
public String toString() {
return String.valueOf("座標row="+row+" 座標col="+col);
}
}