- Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
- 解决企业开发的复杂性。
- Spring理念:使现有的技术更加容易使用,本身是个大杂烩,整合了现有的技术框架。
- Spring是一个开源的免费的框架(容器);
- Spring是一个轻量级,非入侵式(引入了spring 不会改变原来的代码,不会对原项目产生影响)的框架;
- 控制反转(IOC)和面向切面编程(AOP);
- 支持事务的处理,对框架整合的支持;
- 组成
- SpringBoot:一个快速开发的脚手架,基于SpringBoot可以快速开发单个微服务。约定大于配置。
- SpringCloud:基于SpringBoot实现的
- 大部分公司使用Spring Boot进行快速开发,学习SpringBoot前提是掌握Spring和SpringMVC。
- UserDao接口
- UserDaoImpl接口
- UserService业务接口
- UserServiceImpl业务实现类
- 在我们的业务中,用户的需求可能会影响我们 的源代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次的成本十分昂贵!
- 我们使用一个Set接口实现,发生了革命性变化
private UserDao userDao;
//利用set方法动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
- 之前是程序主动创建对象,控制权在程序员手上!
- 使用了set注入后,程序不在具有主动性,而是变成被动接收对象。
- 此思想从本质解决了问题,程序员不用再管理对象的创建。系统耦合性大大降低,可以更加专注与业务实现。
- 之前结构:
- 反转后结构:
- IoC本质:控制反转IoC是一种设计思想,DI(依赖注入)是实现IoC(思想)的一种方法,没有IoC的程序中,我们使用面向对象编程,对象的创建和对象间的依赖关系完全硬编在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,获得依赖对象的方式反转了。
- IoC是Spring框架的核心内容,有很多种方式实现IoC,可以使用XML配置,也可以使用注解,最新版本的Spring可以使用零配置实现IoC.
- Spring容器在初始化时会先读取配置文件吗,根据配置文件或元数据与组织对象存入容器中吗,程序使用时在从IoC容器中取出需要的对象。
- 采用XML配置Bean的时候,Bean 的定义和实现时分离的,使用注解可以把两者合为一体,。
package com.qu.dao;
public class Hello {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public String toString(){
return "Hello{"+"str'"+str+"'"+"}";
}
}
- 使用IoC容器需要配置其元数据在resources文件中配置xml文件,先建立xml文件,文件名即上图中的applicationContest.xml
- 在xml中使用Spring来创建对象,在Spring中这些称作为bean。即对象=bean
- 加载xml文件,固定格式,ApplicationContest contest=new ClassPathXmlApplicationContest (“applicationContest”);//参数可以有多个,就是我们创建的xml文件名。
- contest称为获取Spring的上下文对象,我们的对象都在spring 中管理,想要使用直接去里面取出。
- contest.getBean(“hello”);//参数传入bean的id即可取出对应的对象。需要强转一下类型。
import com.qu.dao.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//获取Spring上下文对象,解析beans.xml文件,生成Bean对象
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContest.xml");
//我们的对象现在都在Spring中管理,需要时直接通过id取出,getBean的参数就是配置文件中的id
Hello hello=(Hello)context.getBean("hello");//并不需要去new一个Hello对象
System.out.println(hello.toString());
}
}
代码左边的叶子表示类已经被Spring托管
- Hello的对象谁创建的?hello对象由Spring生成。
- Hello的对象属性怎么设置的?hello对象属性由Spring容器设置。
- 控制 :谁来控制对象的创建,传统的程序的对象由程序本身控制创建,使用Spring后,现在交给Spring去做;反转:程序本身不创建对象,而编程被动的接收对象,这就是控制反转。
- 总结:所谓的IoC就是对象由Spring来创建,管理,分配。
- ref:引用Spring中已经创建好的对象
- value:具体值,基本数据类型。
- 项目结构:
- Spring中仍然使用无参构造创建对象
package com;
public class User {
private String name;
public User(){
System.out.println("使用了无参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
import com.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
//Spring容器
ApplicationContext context =new ClassPathXmlApplicationContext("Beans.xml");
User user=(User)context.getBean("user");//拿过来强转一下
user.show();
}
}
- Spring中使用有参构造创建对象
package com;
public class User {
private String name;
//创建有参构造
public User(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("name="+name);
}
}
- 此时Xml出错
- 解决:用有参构造创建对象有三个方法
- 方法一:index=0表示下标为0的参数,也就是有参构造中第一个参数
- 方法二:还可以通过参数的类型去匹配,不建议使用,因为当有参构造有两个String参数时就会出错。
- 方法三:ref去指向
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
2.5Bean的配置- 别名在后面引用对象名时user和user2一样。
- id:bean的唯一标识符,也就相当于对象名。
- class:bean对象所对应的权限定名,:包+类型
- name:也就是别名,而且name可以取多个名
2.6 import
- 一般用于团队开发使用,他可以将多个配置文件,导入合并为一个
- 定义多个beans.xml,在applicationContest.xml中导入其他几个,相当于合并
- 假如某项目有三个人开发,这三个人负责不同的类的开发,而不同的类需要注册在不同的bean中,我们可以利用import将所有的beans合并为一个总的配置文件,使用时只用使用这个总的配置。
- 依赖注入:Set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中所有属性由容器来注入
- 环境搭建:
- (1)复杂类型
package com.qu.pojo;
//复杂类型,将地址作为一个引用对象
public class Address {
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- (2)真实测试对象
package com.qu.pojo;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Student {
private String name;
private Address address;
private String[] book;
private List hobbys;
private Map card;
private Set games;
private Properties info;//配置类型,学生信息我们自定义
private String wife;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getBook() {
return book;
}
public void setBook(String[] book) {
this.book = book;
}
public List getHobbys() {
return hobbys;
}
public void setHobbys(List hobbys) {
this.hobbys = hobbys;
}
public Map getCard() {
return card;
}
public void setCard(Map card) {
this.card = card;
}
public Set getGames() {
return games;
}
public void setGames(Set games) {
this.games = games;
}
public Properties getInfo() {
return info;
}
public void setInfo(Properties info) {
this.info = info;
}
public String getWife() {
return wife;
}
public void setWife(String wife) {
this.wife = wife;
}
}
- (3)Beans.xml
- 测试类:
import com.qu.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context =new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student)context.getBean("student");
System.out.println(student.getName());
}
}
- (4)完善注入信息,集合数组等值的注入
3.3拓展方式红楼梦 水浒传 三国
听歌 看电影 敲代码 LOL CF 12345 90



