Spring 是一个系列,包含许多框架,如spring book、spring cloud、spring Date等等
spring Framework 就是我们常说的 spring spring Framewokr是一个分层的J2EE轻量级开源框架
也就是容器框架 他的核心是IOC(控制反转)、DI(依赖注入)、和AOP(面向切面编程)
IOC(控制反转)我的理解就是一种设计模式、控制权的反转,在我们不用spring的时候 我们写代码需要对象的时候都是自己new出来的,控制权在我们自己手里,而spring是将这个控制权交给了它 我们需要对象的时候就跟他要,从而不需要我们自己new对象 这很符合好莱坞的依据名言 Don’t call us We call You (别找我们,我们找你),他创建对象的方式有三种 分别是 “构造方法”,“静态工厂”,“实例工厂”,
1、构造方法创建bean
无参构造方法创建bean:
使用上面的标签配置bean时,容器调用无参构造方法。
-------------------------------------------------------------------------------------------------------------------------------------------------------
有参构造方法创建bean:
静态工厂创建bean
我想要电脑:
方式一:硬盘+主板+内存条+显示器+键盘+鼠标+CPU
方式二:Thinkpad电脑
电脑类:
public class Computer {
private String cpu;
private String disk;
private String memory;
private String board;
private String keyboard;
private String mouse;
-------------------------------------------------------------------------------------------------------------------------------------------------------
静态电脑工厂:
/**
* 静态电脑工厂
* @author Administrator
*
*/
public class ComputerFactory {
//生产电脑
//静态方法
public static Computer createComputer() {
return new Computer("core-i7","500GB机械","4GB","昂达","机械键盘","雷蛇");
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
配置spring.xml
上述配置使用静态工厂创建对象。
并没有创建工厂对象。
3、实例工厂创建
指工厂里创建对象的方法是普通方法,非static的,只能用对象调用。
实例工厂:
/**
* 实例电脑工厂
* @author Administrator
*
*/
public class ComputerFactory {
public ComputerFactory() {
System.out.println("***********");
}
//生产电脑
//普通方法
public Computer createComputer() {
return new Computer("core-i7","500GB机械","4GB","昂达","机械键盘","雷蛇");
}
}
配置spring.xml
上述配置使用实例工厂创建computer对象。
创建了工厂对象。
DI(依赖注入) 当在这里插入图片描述spring的容器初始化好bean的实例对象后,要对这个对象进行初始化,这个过程依旧是是容器来完成,注入的方式一般有“setter方法”和“构造方法”,还有使用注解进行注入。还有一种通过实现特定接口的方式注入,但这种方式污染代码,早就不用了
1、构造方法注入(有参构造)
Student类
public class Student {
private int id;
private String name;
private String sex;
public Student(int id, String name, String sex) {
super();
this.id = id;
this.name = name;
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
配置spring.xml
-------------------------------------------------------------------------------------------------------------------------------------------------------
测试类
public static void main(String[] args) {
//1、解析spring.xml,创建核心容器
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
//2、从容器中取出student
Object bean = ac.getBean("student");
System.out.println(bean);
}
set方法注入(最常用)
Student类
public class Student {
private int id;
private String name;
private String sex;
public void setDd(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
配置spring.xml
-------------------------------------------------------------------------------------------------------------------------------------------------------
测试
public static void main(String[] args) {
//1、解析spring.xml,创建核心容器
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
//2、从容器中取出student
Object bean = ac.getBean("student");
System.out.println(bean);
}
注解注入
@Autowired 自动绑定
@Resource 资源
上面两个注解可以添加在属性上面,如果添加了此注解,容器必须为此属性注入,容器会找一个bean进行赋值,如果找不到就直接报错。
注解注入一般用在对象类型的属性上,不在int,String等基本类型上使用。
注意:注解注入需要添加spring-aop.jar包,配置注解开关。
-------------------------------------------------------------------------------------------------------------------------------------------------------
球队Team类
public class Team {
private int id;
private String name;
@Override
public String toString() {
return "Team [id=" + id + ", name=" + name + "]";
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
球员Player类
public class Player {
private int id;
private String name;
//@Resource
@Autowired
private Team team;
@Override
public String toString() {
return "Player [id=" + id + ", name=" + name + ", team=" + team + "]";
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
配置spring.xml
-------------------------------------------------------------------------------------------------------------------------------------------------------
测试
public static void main(String[] args) {
//1、解析spring.xml,创建核心容器
ApplicationContext ac = new ClassPathXmlApplicationContext("spring2.xml");
//2、从容器中取出student
Object bean = ac.getBean("player");
System.out.println(bean);
}
AOP(面向切面编程)在不修改源代码情况下通过预编译和运行过程中使用动态代理的方法给程序添加统一功能的方法,它可以使业务逻辑的各个部分进行隔离 降低程序的耦合度,我们一般使用在“日志,权限,事务,缓存”等等
动态代理:使用反射机制 方法和对象都是传入的变量,这样我们就可以通过传入的方法和对象而动态调用被代理对象的任何方法 jdk为我们提供了实现此动态代理的api,被代理的类必须实现接口
cglib代理:返回对象是被代理对象的子类,被代理对象不用实现接口,当调用原对象方法时,是实际上调用的是代理子类的方法 。