理解
Spring框架是一个轻量级的开源框架,是核心容器、数据访问与集成、AOP、Web、消息、测试六个模块的集成,主要是为了简化企业级应用的后台开发,降低耦合性。平时接触到最多的还是IoC和AOP两个特性。IoC指的是控制反转,把对象的创建和依赖关系的维护交给Spring容器去管理。Spring通过工厂模式、反射机制等技术管理对象的作用域和生命周期。AoP一般称为面向切面编程,是面向对象的一种补充,将程序中独立于其他功能的方法抽取出来,使Java开发模块化,仅需专注于主业务即可,其实就是一句话:spring是轻量级的控制反转(IOC)和面向切面(AOP)的框架。
优点
- spring是一个开源的、免费的框架(容器)
- Spring是一个轻量级、非入侵(引入不会对现有项目产生影响)的框架
- 控制反转(IOC)、面向切面编程(AOP)
- 支持事务的处理、对框架整合的支持
下载地址
弊端
配置过于繁琐,人称“配置地狱”
IOC理论推导
我们写项目的时候基本上都是三层架构,controller、service、dao、pojo层
daoIMPL实现数据交互
- service层
package service;
public interface UserService {
public void getData();
}
- service实现(主要用于逻辑实现)
package service.impl;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import service.UserService;
public class UserServiceImpl implements UserService {
public void getData() {
UserDao userDao=new UserDaoImpl();
userDao.getData();
}
}
- dao层
package dao;
public interface UserDao {
public void getData();
}
- dao实现(主要用于数据交互)
package dao.impl;
import dao.UserDao;
public class UserDaoImpl implements UserDao {
public void getData() {
System.out.println("连接mysql数据库");
}
}
- 测试类(我这里相当于controller层,接收前台参数,响应数据)
6、假设我们现在需要连接oracle数据库,现在需要写一个oracle实现类
package dao.impl;
import dao.UserDao;
public class OracleImpl implements UserDao {
public void getData() {
System.out.println("连接oracle数据库");
}
}
7、但是如果我们要实现oracle,就必须修改service实现类(逻辑层)
7、测试类不变,这样就打印的是“连接oracle数据库”,这样的话就有一个问题,假设我dao实现有很多呢,每次都得需要改serviceImpl的代码,这就不符合java的七大设计原则中的开闭原则(对扩展开放,对修改关闭),现在我们想不改变serviceImpl的代码,实现oracle和mysql的切换:
service实现类修改如下:
package service.impl;
import dao.UserDao;
import dao.impl.OracleImpl;
import dao.impl.UserDaoImpl;
import service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getData() {
//UserDao userDao=new UserDaoImpl();
//UserDao userDao=new OracleImpl();
userDao.getData();
}
}
我们在测试中就可以自由切换了,不需要在改动逻辑层的代码了
import dao.impl.OracleImpl;
import org.junit.Test;
import service.UserService;
import service.impl.UserServiceImpl;
public class Mytest {
@Test
public void test(){
UserService userService=new UserServiceImpl( );
((UserServiceImpl) userService).setUserDao(new OracleImpl());//强转是因为多态状态下不能实现子类特特有的方法
userService.getData();
}
}
控制反转:获得依赖对象的方式反转了。上面的例子就是用了一个set注入,也就是ioc的本质
IOC概念
- 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为 一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
- 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
依赖注入
依赖注入主要是通过三种方式
1、构造器注入(默认是无参构造)
2、Set 方式注入(xml中配置bean,主要是多个类型(list、map、引用类型等)的注入(需要练一下就行))
3、 扩展方式注入(c 命名空间、p 命名空间)注意是需要导入xml约束,实际上也是set方式注入,也就相当于简写了;
bean的作用域
1、singleton:xml中配置的对象默认是单例模式,也就是application中取出的对象都是同一个对象
2、prototype:原型模式,可以通过scope="prototype"配置,也就是application中取出的对象都不相同
bean的自动装配
1、ByName 的时候,需要保证所有 bean 的 id 唯一,并且这个 bean 需要和自动注入的属性的 set 方法的值一致。
2、ByType 的时候,需要保证 bean 的 Class 唯一,并且这个bean 需要和自动注入的属性的类型一致。
注解实现自动装配
1、@Autowired、@Resource
Autowired默认是按照类型来注入的,需要按名字注入的话可以跟@Qualifier搭配使用
Resource是按照里面的name属性来注入的