1.Spring框架都概念
Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。
Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。
2.Spring框架的基本构造
3.Spring的helloworld
3.3.1 创建maven项目
3.3.2 引入Spring框架
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dyit.spring</groupId>
<artifactId>spring-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
3.3.3 创建实体类
public class Car {
private Integer id;
private String brand;
private String color;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [id=" + id + ", brand=" + brand + ", color=" + color + ", price=" + price + "]";
}
public Car(Integer id, String brand, String color, Double price) {
super();
this.id = id;
this.brand = brand;
this.color = color;
this.price = price;
}
public Car() {
}
}
3.3.4配置Spring容器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car1" class="com.dyit.spring.Car">
<property name="id" value="2"/>
<property name="brand" value="奔驰"/>
<property name="color" value="绿色"/>
<property name="price" value="120000.00"/>
</bean>
</beans>
3.3.5 测试
@Test
public void testSpring() {
//获取容器
ApplicationContext act =
new FileSystemXmlApplicationContext("classpath:spring/applicationContext.xml");
Car car = act.getBean(Car.class,"car1");
System.out.println(car);
}
4.Spring容器(bean)配置文件
4.1 Spring bean的加载流程
Bean的配置信息定义了bean的实现和依赖关系,SPring容器根据各种形式的bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载,实例化bean,并建立bean和bean的依赖关系,最后将这些准备就绪的bean放入bean缓存池中,以供外层程序进行调用。
和mybatis的缓存相类似。、
4.1.1 配置bean
<bean id="car1" class="com.dyit.spring.Car">
<property name="id" value="2"/>
<property name="brand" value="奔驰"/>
<property name="color" value="绿色"/>
<property name="price" value="120000.00"/>
</bean>
</beans>
4.1.2 容器启动 (加载工厂)
//获取容器
ApplicationContext act =
new FileSystemXmlApplicationContext("classpath:spring/applicationContext.xml");
4.1.3 读取配置信息
在容器中定义了一个bean的注册表:将bean信息注册到容器中
4.1.4根据注册表实例化bean对象
4.1.5 放入容器(工厂)的缓存中
Car car = act.getBean(Car.class,"car1");
4.2 bean的配置
4.2.1 bean对象默认是单例的
4.2.2 bean标签
- id/name:在容器中的唯一名称(不能重复)
- class:类的全名—包名+类名
- init-method:在对象创建之后第一个调用的方法
<bean id="bwmx" class="com.dyit.spring.Car" init-method="initx">
- destory-method:在容器销毁对象时调用的方法
<bean id="bwmx" class="com.dyit.spring.Car" init-method="initx" destroy-method="finish">
- ref:引用容器中bean的id/name(可以理解为直接引用对象)
<bean id="bwmx" class="com.dyit.spring.Car" init-method="initx" destroy-method="finish" >
<property name="id" value="1"/>
<property name="brand" value="奔驰"/>
<property name="color" value="黄色"/>
<property name="price" value="800000.00"/>
</bean>
<bean id="tom" class="com.dyit.spring.Person">
<property name="name" value="关羽"/>
<property name="car" ref="bwmx"/>
</bean>
<bean id="com" class="com.dyit.spring.Conpany">
<property name="name" value="中国石油"> </property>
<property name="map" >
<map>
<entry key="万科" value-ref="emp1"/>
<entry key="甲骨文" value-ref="emp1"/>
<entry key="中国石油" value-ref="emp1"/>
</map>
</property>
</bean>
<bean id="emp1" class="com.dyit.spring.Emp">
<property name="name" value="老王"></property>
<property name="books" >
<list>
<ref bean="book1"/>
<ref bean="book1"/>
<ref bean="book1"/>
<ref bean="book1"/>
</list>
</property>
</bean>
<bean id="book1" class="com.dyit.spring.Book">
<property name="title" value="一个小目标"></property>
<property name="author" value="佚名"></property>
<property name="price" value="66.66"></property>
</bean>
4.2.3使用注解配置
@Controller
@Service
@Repository
@Component
<context:component-scan base-package=“com.dyit.spring”/>
扫描包下的类是否有@Controller, @Service @Repository @Component,将注解的类注册,实例化放入缓存
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.dyit.spring"/>
</beans>
public interface IBookService {
void deleteBook(int id);
}
@Service
public class BookServiceImpl implements IBookService {
@Override
public void deleteBook(int id) {
System.out.println("删除"+id+"成功");
}
}
@Controller
public class BookController {
//@Autowired :自动查找容器中是否有IBookSerivce这种类型的对象,如果有则注入对象
@Autowired
private IBookService ibs; //ibs = new 。。。。
public void del() {
ibs.deleteBook(1);
}
}
4.3 Spring的IoC容器
Spring容器是Spring框架的核心。容器将创建对象,把他们连接在一起,配置他们,并管理他们的整个生命周期,从创建到销毁。
IoC容器是具有依赖注入功能的容器,它可以创建对象,IoC容器负责实例化、定位、配置应用程序中的对象及建立对象间的依赖。通常new一个实例,控制权由程序员控制,而控制反转是指new实例工作不由程序员来做,而是交给Spring容器来做.
Spring IoC容器---->工厂模式
POJO:对象
配置(xml,注解)–>解析–>POJO–>IoC–>从IoC获取对象
4.3.1 IoC的概念
IoC:Inverse Of Control 控制反转
通俗来讲:对象由IoC容器构造,当我们需要时从IoC获取对象
4.3.2 DI是什么
实现过程中很复杂,很难实现。有些概念没有交代的特别清楚
如:控制权是什么?如何反转?反转什么?
DI:依赖注入
4.3.2.1set注入(推荐)
<bean id="pb" class="com.dyit.entity.Publisher">
<property name="id" value="1"/>
<property name="name" value="工人出版社"/>
<property name="loc" value="长安区"/>
</bean>
4.3.2.2构造方法注入
public class Author {
private Integer id;
private String name;
private String address;
public Author() {
}
public Author(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "Author [id=" + id + ", name=" + name + ", address=" + address + "]";
}
}
<bean id="au" class="com.dyit.entity.Author">
<constructor-arg name="name" value="张三"/>
<constructor-arg name="address" value="西安"/>
</bean>