Spring_day01
1、Spring4学习路线
- Spring第一天:Spring概述,SpringIOC入门(xml),Spring的bean管理,Spring属性注入
- Spring第二天:Spring的IOC的注解方式,Spring的IOP开发(XML)
- Spring第三天:Spring的IOP的注解开发,Spring的声明式事务,jdbcTemplate
- Spring第四天:SSH的整合,HibernateTemplate的使用,OpenSessionInViewFilter的使用
2、Spring概述
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
- Spring 叫做SE/EE开发的一站式框架。
- 一站式框架:有EE开发的每一层的解决方案。
- WEB层 :SpringMVC
- service层 :Spring的bean管理,Spring声明式事务
- DAO层 :Spring的jdbc模板,Spring的ORM模块
- 一站式框架:有EE开发的每一层的解决方案。
3/Spring的入门(IOC)
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
- IOC:控制反转
- 控制反转:将对象的创建权转给(交给)Spring。
3.1下载Spring的开发包并解压
官网:https://spring.io/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WwiJMwj-1572753833241)(images/20191013211645457_19629.png)]
解压到合适的目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTe1oGC5-1572753833246)(images/20191013212213329_17733.png)]
- doc :Spring的开发规范和API
- libs : Spring的开发的jar和源码
- schema :Spring的配置文件的约束
3.2创建web项目,引入jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKTIUe7n-1572753833252)(images/20191013215626239_20727.png)]
3.3创建接口和类
- 创建UserService接口
public interface UserService {
public void save();
}
- 创建UserServiceImpl接口并实现UserService接口
public class UserServiceImpl implements UserService{
@Override
public void save() {
System.out.println("UserService执行了........");
}
}
- 编写测试类
- 用传统方式
public void demo1() {
UserService userService = new UserServiceImpl();
userService.save();
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6zyaR1G-1572753833255)(images/20191014213335552_25995.jpg)]
3.4将实现类交给Spring管理
在D:\MyData\Spring\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html中的xsd-configuration.html文件
<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">
<!-- Spring放入入门的配置 -->
<bean id="UserService" class="com.musapir.Spring4.demo1.UserServiceImpl"></bean>
</beans>
- Spring方式的调用
public void demo2() {
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("UserService");
userService.save();
}
3.4.1IOC和DI(面试)
- IOC:控制反转,将对象的创建权转给了Spring
- DI:依赖注入,前提是必须有IOC环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
4、Spring的工厂类
4.1BeanFactory(老版本的工厂类)
- BeanFactory:调用getBean的时候,才会生成类的实例。
4.2ApplicationContext(新版本的工厂类)
- ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化。
- ApplicationContext有两个实现类:
- ClassPathXmlApplicationContext:加载内路径下的配置文件
- FileSystemXmlApplicationContext:加载文件系统下的配置文件
5、Spring的配置
5.1XML的提示配置
-
Schema的配置
-
Bean的相关的配置
- id :使用了约束中的唯一约束 。里面不能出现特殊字符
- name :没有使用约束中的唯一约束(理论上可以重复出现,但实际开发中不能出现),可以出现特殊字符。
- Spring和Struts1框架整合的时候
<bean name="/user" class=""/>
- Spring和Struts1框架整合的时候
-
Bean的生命周期的配置
- init-method : Bean被初始化的时候执行的方法
- destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
public class CustomerDAOImpl implements CustomerDAO{
public void setUp() {
System.out.println("CustomerDAOImpl被初始化了");
}
@Override
public void save() {
System.out.println("CustomerDAOImpl的save方法执行了");
}
public void destroy() {
System.out.println("CustomerDAOImpl被销毁了");
}
}
<!-- Spring的bean的生命周期的配置 -->
<bean id="customerDao" class="com.musapir.Spring4.demo2.CustomerDAOImpl" init-method="setUp" destroy-method="destroy"></bean>
- Bean的作用范围的配置
- scope:Bean的作用的范围
- singleton :默认的,Spring会单例模式创建对象
- prototype :多例模式。
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后会放在session中。
- globalsession :应用在web项目中,必须在porlet环境下使用。
- scope:Bean的作用的范围
5.2 Spring 的属性注入
5.2.1 构造方法的方式的属性注入
编写Car类,并提供构造方法
public class Car {
String name;
double price;
public Car(String name, double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
在配置文件中提供属性和值
<!-- Spring的属性注入的方式======================== -->
<!-- 构造方法的方式 -->
<bean id="car" class="com.musapir.Spring4.demo3.Car">
<constructor-arg name="name" value="宝马"/>
<constructor-arg name="price" value="600000"/>
</bean>
编写测试类
public void demo1() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) context.getBean("car");
System.out.println(car);
}
5.2.2 Set方法的方式的属性注入
编写car2类,提供set方法
public class Car2 {
private String name;
private double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car2 [name=" + name + ", price=" + price + "]";
}
}
在配置文件中设置属性值
<!-- 提供set方法的方式 -->
<bean id="car2" class="com.musapir.Spring4.demo3.Car2">
<constructor-arg name="name" value="PUMA宝马"/>
<constructor-arg name="price" value="1000000"/>
</bean>
编写测试类
public void demo2() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car2 car2 = (Car2) context.getBean("car");
System.out.println(car);
}
set方法设置对象类型的属性的值
public class Employee {
private String name;
private Car2 car2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car2 getCar2() {
return car2;
}
public void setCar2(Car2 car2) {
this.car2 = car2;
}
@Override
public String toString() {
return "Employee [name=" + name + ", car2=" + car2 + "]";
}
}
<!-- set方法注入对象类型的属性 -->
<bean id="employee" class="com.musapir.Spring4.demo3.Employee">
<!-- value:设置普通类型的值,ref:设置其他类的id或name -->
<property name="name" value="Mamat"/>
<property name="car2" ref="car2"/>
</bean>
5.2.3 p名称空间的属性注入(Spring 2.5版本之后)
- 通过引入p名称空间完成属性的注入
- 写法:
- 普通属性 —> p:属性名=“值”
- 对象属性 ----> p:属性名-ref=“值”
- 写法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2469NBXB-1572753833256)(images/20191019102413325_27828.png)]
<!--注入p命名空间的方式 -->
<bean id="car" class="com.musapir.Spring4.demo3.Car" p:name="YAMAHA" p:price="100000"></bean>
<bean id="employee" class="com.musapir.Spring4.demo3.Employee" p:name="张三" p:car2-ref="car2"></bean>
5.2.4 spEL的属性注入(Spring 3.0版本之后)
- SpEL :Spring Expression Language:Spring表达式语言
- 语法:
- #{SpELl}
- 语法:
<!-- SpEL的属性注入 -->
<bean id="car2" class="com.musapir.Spring4.demo3.Car2">
<property name="name" value="#{'KIYA'}"/>
<property name="price" value="#{6000000}"/>
</bean>
对象属性的注入
<bean id="employee" class="com.musapir.Spring4.demo3.Employee">
<property name="name" value="Mamat"/>
<property name="car2" value="#{car2}"/>
</bean>