我們在做項目的過程中,有一些所有項目都會用到的服務性的東西,如工廠,connection, session,對象,事務等。這些在任何項目中都需要用到,都需要手動重新編寫代碼。
spring是一個輕量級容器架構,將以上所有項目通用的服務提取出來,做成容器,之後每次需要用到這些服務的時候,直接交給spring管理,開發人員不用再手動編寫代碼。
接下來我們詳細介紹下用 spring 來管理對象:
1. Java中對於對象的處理過程:
(1) new ------手動編寫代碼
(2) 通過工廠 new -------手動編寫代碼
(3) 通過動態代理 --------手動編寫代碼
(4) spring IOC 框架 -------將對象交給 spring 來處理,開發者不用關注對象的具體處理過程,不用編寫大量代碼
2. idea中使用 spring 的過程:
(1)引入 spring 依賴包 ------- spring.jar log4j.jar
(2)配置配置文件 applicationContext.xml
(3)用構造函數或者 set 的方式,注入對象
(4) 用 BeanFactory去查找配置文件
我們用代碼來演示:
//接口: UserDao.java
public interface UserDao {
public void getLogin(String username, String password);
}
//UserDao 的實現類 UserDao4sql.java
public class UserDao4sql implements UserDao {
@Override
public void getLogin(String username, String password) {
System.out.println("UserDao4sql.getLogin");
}
}
UserDao 的實現類 User4Oracle.java
public class User4Oracle implements UserDao {
@Override
public void getLogin(String username, String password) {
System.out.println(User4Oracle.getLogin);
}
}
//接口 ManagerTester.java
public interface ManagerTester {
public void addUser(String username, String password);
}
// ManagerTester的實現類 ManagerImmpl.java
public class ManagerImmpl implements ManagerTester {
private UserDao userDao;
//構造器的形式注入
public ManagerImmpl(UserDao userDao) {
this.userDao = userDao;
}
//set的形式注入 -------與構造器方式二選一, set注入是最推薦方式
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String username, String password) {
userDao.getLogin(username,password);
}
}
//spring配置文件 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<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-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
//真正需要配置的對象對應關係
//id只是一個標識名,可以隨便寫
<bean id="UserDao4sql" class="*.*.*.UserDao4sql"/>
<bean id="UserDao4Oracle" class="*.*.*.UserDao4Oracle"/>
<bean id="ManagerTester" class="*.*.*.ManagerImmpl">
//用構造器的方式注入 配置
<constructor-arg ref="UserDao4sql"/>
//用 set的方式注入 配置
<property name="userDao" ref="UserDao4sql"/>
</bean>
需要注意的兩點,第一點是配置文件的配置,第二點是注入的方式。
//測試類 Client.java
public class Client {
public static void main(String[] args) {
BeanFactory bean = new ClassPathXmlApplicationContext("applicationContext.xml");
ManagerTester managerTester = (ManagerTester )bean.getBean("ManagerTester ");
managerTester .addUser("zhangsan","123456");
}
}
spring的核心點有兩點,一個是 AOP 一個是 IOC,IOC指的是控制反轉,也就是說所有東西都交給spring管理,不用在代碼中顯示編寫代碼,代碼中需要的話, spring自動注入進去就行。AOP指的是聲明式服務,也就是說所有的管理過程都配置在配置文件中,不用編寫到代碼中。AOP的底層實現式 JDK 的動態代理。橫向切面服務就指的是將所有共有的小服務都拿出來,放在容器中,需要用的時候由spring主動給你。