* spring 是分层的 java ee 应用,全栈(full-stact)轻量级开源框架,主要有 IOC(反转控制) 、 AOP(面向切面编程)
* 反转控制:将对象的创建全交给 spring,有利于解耦,降低代码的依赖关系
① 导包
需要导入 4 个jar包 【spring-aop 、spring-beans 、spring-core 、spring-expression】
导入 spring-context 相当于直接导入四个
② 编写类
③ 创建并配置核心配置文件 applicationContext.xml 【可以任意命名,但约定俗成为 applicationContext.xml】
④ 使用 spring 的 api 获取 Bean
<?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="唯一id名" class="关联全类名" >
</bean>
</beans>
① 属性:scope
② 取值:singleton【单例】
prototype【多例】
------ 了解 ------
--- 用于web项目---
request
session
global session
③ 注意
- 单例只在配置文件加载时创建一次,多例只要是调用 getBean 方法就会创建对象
- 单例可能会造成数据泄露而多例不会,在单例中定义局部变量可以解决数据泄露问题
- 单例执行效率大于多例
④ 示例
<bean id="userService" class="com.softwareMan.service.UserService" scope="prototype"></bean>
① 创建
- 属性:init-method
- 取值:关联类中的方法
- 属性:destory-method
- 取值:关联类中的方法
<bean id="userService" class="com.softwareMan.service.UserService" init-method="init"></bean>
① 无参构造方法实例化【☆☆☆☆☆】
* 配置
<bean id="userService" class="com.softwareMan.service.UserService" ></bean>
* 注意
必须要有无参构造方法
② 工厂静态方法实例化
* 配置
<bean id="userService" class="com.softwareMan.factory.UserServiceFactory" factory-method="getUserService" ></bean>
* 注意
- class 属性指向 工厂类
- 一定要有 factory-method 属性,不然默认寻找空参构造
- 工厂静态方法实例化中 factory-method 配置的方法为静态方法
- 可以用来获取不能直接 new 的对象,例如:connection
③ 实例化
* 配置
<bean id="factory" class="com.softwareMan.factory.UserServiceFactory" ></bean>
<bean id="userService" factory-bean="factroy" factory-method="getUserService" ></bean>
* 注意
- 此方法中工厂类中方法不是静态方法,需要使用对象调用,故先要配置工厂类
① 什么是DI
* 依赖注入是反转控制的具体实现,通过反转控制将对象的创建权交给了spring以降低耦合能消除耦合,通过依赖注入让spring来维护
② 注入对象
- set方法一
* 前置条件
要有成员变量以及提供set方法
* 配置
<bean id="id名1" class="全类名1"></bean>
<bean id="id名2" class="全类名2">
<property name="类2中的属性" ref="id名1" ></property>
</bean>
* 示例
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.softwareMan.service.UserService">
<property name="userDao" ref="userDao" ></property>
</bean>
- set方法二
* 示例
xmlns:p="http://www.springframework.org/schema/p"
【配置】
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.softwareMan.service.UserService" p:userDao-ref="userDao"></bean>
- 构造方法
* 前置条件
被注入的方法必须要有成员变量以及有参构造
* 配置
<bean id="id名1" class="全类名1"></bean>
<bean id="id名2" class="全类名2">
<constructor-arg name="类2中的属性" ref="id名1" ></constructor-arg>
</bean>
* 示例
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.softwareMan.service.UserService">
<constructor-arg name="userDao" ref="userDao" ></constructor-arg>
</bean>
③ 注入数据【set方式与构造方式类似】
- 普通(基本数据类型/string)
* 示例
<constructor-arg name="name" value="123" />
- List
* 示例
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
<constructor-arg name="list" >
<list>
<value>123</value>
<value>456</value>
</list>
</constructor-arg>
</bean>
- Map
* 示例
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
<property name="map" >
<map>
<entry key="aaa" value="111"></entry>
<entry key="bbb" value="222"></entry>
</map>
<property>
</bean>
- properties
* 示例
<bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
<constructor-arg name="pro">
<props>
<prop key="sss">1111</prop>
<prop key="ssd">2222</prop>
</props>
</constructor-arg>
</bean>
④ 优缺点
- set
* 优点
参数比较灵活,可以不赋值
* 缺点
某些参数需要使用,单位赋值
- 构造方法
* 优点
强制给数据赋值
* 缺点
未用到此数据任要赋值
⑤ 引入其他配置文件【分模块开发】
* 示例
<import resource="applicationContext.xml" />
BeanFactory //顶层接口,调用getBean时才会创建对象(懒汉)
-- ApplicationContext //配置文件加载时就会创建对象(饿汉),适用于单例
-- ClassPathXmlApplicationContext //加载类路径下的配置文件,即resources下
-- FileSystemApplicationContext //加载本地配置文件
-- AnnotationConfigApplicationContext //读取注解配置
* getBean(String)
根据 Bean 的id返回 Bean 的实例,返回值为 Object
* getBean(Class)
根据字节码文件返回 Bean 的实例,返回值为相应类型,当有对各相同的类型的 Bean 时会报错
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
import com.softwareMan.dao.UserDao;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class UserDaoImpl implements UserDao {
private String name;
private List<String> list;
private Map<String,Integer> map;
private Properties pro;
public UserDaoImpl(String name, List<String> list, Map<String, Integer> map, Properties pro) {
this.name = name;
this.list = list;
this.map = map;
this.pro = pro;
}
public void show() {
System.out.println(name + "======" + list + "===========" + map + "===========" + pro);
}
}
import com.softwareMan.dao.UserDao;
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void method() {
userDao.show();
}
}
<?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="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
<constructor-arg name="name" value="123" />
<constructor-arg name="list" >
<list>
<value>123</value>
<value>123</value>
<value>123</value>
<value>123</value>
</list>
</constructor-arg>
<constructor-arg name="map" >
<map>
<entry key="sdss" value="23"></entry>
<entry key="ff" value="23"></entry>
<entry key="sdffffss" value="23"></entry>
</map>
</constructor-arg>
<constructor-arg name="pro">
<props>
<prop key="sss">1111</prop>
<prop key="ssd">1111</prop>
<prop key="ffs">1111</prop>
</props>
</constructor-arg>
</bean>
<bean id="userService" class="com.softwareMan.service.UserService">
<constructor-arg name="userDao" ref="userDao" ></constructor-arg>
</bean>
</beans>
import com.softwareMan.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
public void testA() {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) app.getBean("userService");
System.out.println(userService);
}
}