spring IOC
spring是什么
分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。
提供了展现层 (SpringMVC)和持久层 (Spring JDBCTemplate)以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架
解决了什么问题
程序员不需要创建对象、销毁对象、管理对象的生命周期,只需要使用对象。spring结局的问题就是需要经常新建对象的问题,避免了关键字new造成耦合的问题。spring不再需要进行明确的引用关系传递,直接通过配置完成。
所有框架几乎都可以在spring中整合在一起使用;
优势
- 方便解耦,简化开发;
- AOP 编程的支持
- 声明式事务的支持
- 方便程序的测试
类与类之间的关系
依赖
(Dependency)对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系
关联
(Association)对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。指一个类指到另一个类中的属性. 而且是长期的 (不带有包含关系的关联)
聚合
(Aggregation)表示has-a的关系,是一种不稳定的包含关系。聚合类不必对被聚合类负责。使用集合属性表达聚合关系。较强于一般关联 , 有整体与局部之间的关系,并且没有了整体,局部也可单独存在,如主板、显卡和计算机就是聚合关系。
组合
(Composition)表示contains-a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。也使用集合属性表达聚合关系
继承
表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。
IOC和DI
IOC(Inversion of Control 控制反转),软件系统在没有引入IOC容器之前,如果一个对象A依赖于一个对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上,即创建什么对象决定权在创建方手上。
DI(Dependency Injection 依赖注入),控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。“控制反转”的一个更合适的名字叫就叫做“依赖注入(Dependency Injection)”,同时实现IOC的方法也是注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
构造方法注入
import com.wanxi.dao.UserDao;
public class UserService {
private UserDao userDao;
public UserService() {
}
public UserService(UserDao userDao){
this.userDao = userDao;
}
public void login(){
userDao.find();
System.out.println("com.wanxi.service UserService.login()");
}
}
package com.wanxi;
import com.wanxi.dao.UserDao;
import com.wanxi.service.UserService;
public class Main {
public static void main(String[] args) {
UserDao userDao = new UserDao();
// 构造方法注入
UserService userService = new UserService(userDao);
userService.login();
}
}
set方法注入
import com.wanxi.dao.UserDao;
public class UserService {
private UserDao userDao;
public UserService() {
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void login(){
userDao.find();
System.out.println("com.wanxi.service UserService.login()");
}
}
package com.wanxi;
import com.wanxi.dao.UserDao;
import com.wanxi.service.UserService;
public class Main {
public static void main(String[] args) {
UserDao userDao = new UserDao();
// set方法注入
UserService userService = new UserService();
userService.setUserDao(userDao