目录
1、IOC: Inversion Of Control,控制反转
一、名词解释
- JAR包: JAR(Java Archive)是一种软件包的压缩格式。包含大量Java类文件、相关的元数据和资源(文本、图片、xml等)文件到一个压缩包当中。即写好不能够编译后的一个 java 程序包。
Library: 库。JAR包的集合。Library常常被缩写为lib。
User Library: 用户库。JAR包的集合。
Bean: Bean的广义上解释为任何的java对象。Bean的狭义解释为:需要在视图上展示,或需要被序列化与反序列化的对象。它的作用与VO(View Object) ,POJO(Plain Ordinary Java Object) 是十分相拟的。
ID: 唯一标识符。使某个对象唯一的凭证。类似于身份证号是唯一的。
Name:名字。类似于身份证上的名字(不必为一,可以重复)。
Log4j: log for java。Log是日志的意思。for是用途。Log for java :用于java的日志工具。
- 切面:切面指的是辅助业务类。
- 被切面:被切面指的是主业务类。
- 切点:被切面当中的方法称为切点。切点的英文是:JoinPoint。又称切入点,联合点,连接点。它是两个面的连接点。
通知:切面当中的方法称为通知。通知的英文是:Advice。
- 代理:代理是以被代理者的名义进行活动的行为。AOP中的代理是动态代理,是运行时动态的把被切面(主业务)和切面(从业务)的一部分拼接在一起形成,有人形象的把这种行为称作”动态织入”。
- IDE:Integrated Development Environment 。集成开发环境。常见的集成开发环境:NetBeans,Eclipse,MyEclipse,IDEA。
- DB:Database。数据库。
二、Spring是什么?
Spring 是面向分层的 Java 一站式轻量级开发源框架,优势是任意分层可以使用任何组件。整合资源,优秀的可插拔性。
三、Spring 的主要功能(两大核心IOC和AOP)
1、IOC: Inversion Of Control,控制反转
将设计好的对象交给容器管理,而不是传统的在对象内部直接控制。IOC 是由一个专门的容器来管理这些对象,既 由IOC 容器控制对象的创建,解决耦合问题。
①举例说明
//创建对象
public class UserService {
private IUserDao userDao = new UserDao();//多态:父类型引用指向子类型
public void save(User user) {
userDao.save(user);
}
}
public class Test {
public static void main(String[] agrs) {
UserService userService = new UserService();
userService.save(user);
}
}
//反转:
public class UserService {
private IUserDao userDao;//多态,不实例化
public void save(User user) {
userDao.save(user);
}
//使用Setter来设置userDao
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
public class Test {
public static void main(String[] agrs) {
UserService userService = new UserService();
userService.setUserDao(new UserDao());//多了这一行
userService.save(user);
}
}
Dao 本应该在 Service 内部创建及维护。控制反转是应用(Service)本身不负责依赖对象(Dao)的创建及维护,依赖对象的创建是由外部容器(Test)负责的。这样控制权就由应用内部转移到了应用外部容器(依赖倒置)。
②为什么这么做?
做了反转就有了无数种可能。不做反转有且只有一种可能。
③IOC 容器
IOC 容器:依赖对象的创建及维护是由外部容器负责的,这里就是指 IOC 容器。
所有的对象都要盛装载 IOC 容器中,由 IOC 容器统一调度和分发。这就实现了优秀的插拔能力(高内聚,低耦合)。
耦合:模块之间的依赖关系,模块间联系越多,其耦合性越强,独立性越差。
内聚:模块之间的独立性越强内聚程度越高
2、DI:依赖注入
由容器动态的将某个依赖注入到组件中,从而提高组件重用的频率。
核心:把依赖交给容器,容器帮你管理依赖。
3、AOP:
面向切面编程(AOP):运行期动态实现在不修改源代码的情况下给程序添加功能。对目标功能进行扩展或者是增强,让主业务方法变得简单和单纯。
代理:是一种设计模式,提供了对目标对象另外的访问方式:通过代理访问目标对象
静态代理:继承父类或者实现接口
在编译阶段就已经存在的代理。它需要实现与目标对象一样的接口。
优点:可以做到在不修改源代码的情况下,对目标对象功能扩展。
缺点:
因为代理对象需要与目标对象实现一样的接口,所以代理类较多
一旦接口增加方法,目标对象与代理对象都要维护。
动态代理:在编译阶段不存在,运行时才动态生成的代理。
jdk 动态代理:为接口生成子类,子类和父类之间是接口实现关系,自动调用
cglib 动态代理(子类代理):为类生成子类,子类和父类之间是继承关系会自动使用 cglib
区别:
jdk 代理对使用动态动态代理的类必须实现一个或多个接口;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理 final 修饰的类。
二、常用注释
向容器中注入:
@Repository: 用于向 IOC 容器中放入持久层
@Service: 用于向 IOC 容器中放入业务层
@Controller: 用于向 IOC 容器中放入控制层
@Component: 用于向 IOC 容器中放入组件(任何类型)
从容器中取出:
@Autowire: ByType自动从容器中按照类型查找匹配的 Bean,并执行 DI(无需Setter,使用反射完成)
@Resource(name="名称"):ByName按名称取出,用于资源文件(最好不用)
@Qualifier("名称"):按名称取出,(必须和 @AutoWire 同时存在)等价于 byname
@Value:用于解析 properties
3、Spring 依赖注入方式:
1、set 方法注入
2、构造器注入
3、静态工厂的方法注入
4、实例工厂的方法注入
4、set 跟构造器注入的区别:
构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
如果使用 xml 来描述依赖,Setter 注入的可读写会更强。
强制依赖使用构造器注入,可选依赖使用 setter 注入。