一、Spring概念
1 spring是开源的轻量级框架
2 spring核心主要两部分:
1)aop:面向切面编程,实现扩展功能时不修改源代码
2)ioc:控制反转--通过配置spring的方式创建类对象,而不是new
ioc好处:当类的路径发生变化时,只需修改配置文件,不需要修改代码。
ioc操作有两种方式:
1)ioc的配置文件方式
2)ioc的注解方式
3 spring是一站式框架
1)spring在javaee三层结构中,每一层都提供不同的解决技术
- web层:springMVC
- service层:spring的ioc
- dao层:spring的jdbcTemplate
4 spring版本
(1)hibernate5.x
(2)spring4.x
二、ioc的配置文件
ioc配置底层使用的技术
1)xml配置文件
2)dom4j解决xml
3)工厂设计模式
4)反射
ioc实现原理
2.2 IOC配置入门案例
第一步 导入jar包
- 四个核心的jar包; 两个支持日志输出的jar包
第二步 创建类,在类里面创建方法
第三步 创建spring配置文件,配置创建类
步骤:
1)spring核心配置文件名称和位置不是固定的
- 建议放到src下面,官方建议applicationContext.xml
2)引入schema约束
3)配置对象创建
第四步 测试
代码示例:
xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入schema约束 -->
<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="user" class="ioctest.User"></bean>
</beans>
测试类:
public class IocTest {
@Test
public void iocTest() {
// 1 加载spring配置文件,根据<bean>创建对象
// 原理:底层封装了dom4j解析和反射功能
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2 得到配置创建的对象 传参为<Bean>标签的id值
User user = (User) context.getBean("user");
// 3 输出测试
System.out.println(user);
user.add();
}
}
2.3 解决配置文件没有提示的问题
原理:向spring中引入schema约束,应把约束文件引入到eclipse中
先复制约束路径 , 粘贴到Key值中
三、Spring的bean管理(xml方式)
3.1实例化bean的三种方式
1)使用类的无参构造创建(重点)
public class User {
public void add() {
System.out.println("add().......");
}
}
问题:如果类里面没有无参构造,则会出现异常
2)使用静态工厂创建
流程:在类中创建静态方法,返回类对象
代码:
public class StaticFactory {
//使用静态方法,返回创建对象
public static Bean getBean(){
return new Bean();
}
}
3)使用实例工厂创建
流程:在类中创建非静态方法,返回类对象
代码:
public class InstantiationFactory {
//普通方法,返回创建对象
public Bean getBean(){
return new Bean();
}
}
3.2 三种方式的xml配置:
<!-- 引入schema约束 -->
<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">
<!-- 1 配置含无参的类 -->
<bean id="user" class="ioctest.User"></bean>
<!-- 2 使用静态工厂创建对象 -->
<bean id="bean" class="ioctest.StaticFactory" factory-method="getBean"></bean>
<!-- 3 使用实例工厂创建对象 -->
<!-- 先创建工厂对象 ,再使用工厂对象调用方法创建对象 -->
<bean id="InstantiationFactory" class="ioctest.InstantiationFactory"></bean>
<bean id="bean" factory-bean="InstantiationFactory" factory-method="getBean"></bean>
</beans>
3.3 Bean标签常用属性
1)id属性:id属性值任意命名,但不能包含特殊符号
作用:根据id值得到配置对象
2)class属性:属性值为创建对象所在类的全路径
3)name属性:功能和id属性一样,但可以包含特殊符号
4)scope属性
- singleton(默认):单实例创建对象
- prototype:多实例创建对象
- request:创建对象把对象放到request域里面
- session:创建对象把对象放到session域里面
- globalSession:创建对象把对象放到globalSession里面
四、属性注入
解释:在创建对象时,向类中属性设置值
注入方式(三种):
1)使用set方法注入
2)使用有参数构造注入
3)使用接口注入
注:在spring框架里面,仅支持前两种方式!!
4.2 使用有参数构造注入属性
思路: 在xml配置中,在<bean>内使用<constructor-arg>标签,设置属性值
代码示例:
带参构造原型:
public class PropertyDemo1 {
private String username;
//含参构造
public PropertyDemo1(String username){
this.username = username;
}
//输出方法
public void test1(){
System.out.println("demo1 username:"+username);
}
}
xml:
<!-- 使用带参构造注入属性 -->
<bean id="demo1" class="property.PropertyDemo1">
<!-- 使用<constructor-arg>标签 name为属性名,value为注入属性值-->
<constructor-arg name="username" value="张三"></constructor-arg>
</bean>
4.3 使用set方法注入属性(重点)
思路: 在xml配置中,在<bean>内使用<property>标签,设置属性值
代码示例:
原型:
public class Book {
private String bookname;
//set方法
public void setBookname(String bookname) {
this.bookname = bookname;
}
//输出方法
public void test1(){
System.out.println("bookname:"+bookname);
}
}
xml:
<!-- 使用set方式注入 -->
<bean id="book" class="property.Book">
<!-- 使用<property>标签 name为属性名,value为注入属性值 -->
<property name="bookname" value="JAVA三月通"></property>
</bean>
4.4 注入对象类型属性(重点)
解释:将一种类对象作为属性 注入到 另一类对象中。
使用场景:用于service层与dao层中。将dao层对象注入到service层中使用。
实现步骤:
1)创建service类和dao类
2)在service创建dao类型属性
3)生成dao类型属性的set方法
4)配置文件中注入两者关系
代码示例:
类原型:
public class UserService {
//定义UserDao类型属性
private UserDao userDao;
//生成属性set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//测试方法
public void add(){
userDao.add(); //调用userDao中方法
}
}
public class UserDao {
//测试方法
public void add(){
System.out.println("userDao.....");
}
}
xml:
<!-- 配置service和dao对象间关系
步骤:
1)配置创建两种对象,
2)在service中声明dao属性(使用peroperty标签)
-->
<bean id="userDao" class="property.UserDao"></bean>
<bean id="userService" class="property.UserService">
<!-- 在service配置中注入dao对象
name:service类中属性名称
ref:被配置对象的bean标签中的id值
-->
<property name="userDao" ref="userDao"></property>
</bean>
测试:
public class IocTest {
@Test
public void iocTest() {
// 1 加载spring配置文件,根据<bean>创建对象
// 原理:底层封装了dom4j解析和反射功能
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2 得到配置创建的对象 传参为<Bean>标签的id值
UserService userService = (UserService) context.getBean("userService");
// 3 输出测试
userService.add();
}
}
4.5 P名称空间注入
约束声明:
注入格式: p:属性名="属性值"
4.6 注入复杂类型属性
1) 数组
2) list集合
3) map集合
4) properties类型
xml代码:
<!-- 注入复杂类型属性值 -->
<bean id="person" class="property.Person">
<!-- 数组 -->
<property name="arrs">
<list>
<value>小王</value>
<value>小马</value>
<value>小宋</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>小奥</value>
<value>小金</value>
<value>小普</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
五、Spring整合web项目原理
作用:加载spring核心配置文件。
优点:把加载配置文件和创建对象的过程,在服务器启动时候完成
new方式创建对象缺点:功能可以实现,但效率很低
底层技术:
1)ServletContext对象
2)监听器
使用细节:
- 流程:
1)服务器启动时,监听器会监听加载配置文件。
2)通过配置文件创建对象。
3)并把创建的对象放进ServletContext域中
-- 放对象到ServletContext域对象里面(setAttribute方法)
-- 取对象,从ServletContext域得到 (getAttribute方法)
5.2 IOC和DI区别
IOC: 控制反转,把对象创建交给spring进行配置
DI: 依赖注入,向类里面的属性中设置值
IOC创建对象,DI向类中属性设置值
关系:DI(依赖注入)不能单独存在,需要在ioc基础之上完成操作