1.Spring
1.1Spring2大核心:
IOC:控制反转
作用:降低耦合
AOP:面向切片编程
1.2入门实现步骤:
- 导入Spring开发的基本坐标
- 创建Spring核心配置文件:applicationContext.xml
- 在配置文件中进行配置
- 创建ApplicationContext对象getBean
1.3导入Spring基本坐标
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2.创建Spring配置文件
2.1配置文件中配置UserDaoImpl
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
2.2使用Spring的API获取Bean实例
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.save();
3.Bean标签的基本配置
- id:Bean实例在Spring容器中的唯一标识
- class:Bean的全限定名称
- scope:指对象的作用范围
更多详细配置可以查看 BeanDefinitionParserDelegate
的成员变量即为Bean标签的可取值
3.1scope取值范围
取值范围 | 说明 |
---|---|
singleton | 默认值:单例 |
prototype | 多例的 |
request | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session | WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session |
1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
3.2Bean的生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
3.2Bean实例化的三种方式
使用无参构造
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
工厂静态方法实例化
public class StaticFactoryBean { public static UserDao createUserDao(){ return new UserDaoImpl(); } }
<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" factory-method="createUserDao" />
工厂实例方法实例化
public class DynamicFactoryBean { public UserDao createUserDao(){ return new UserDaoImpl(); } }
<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/> <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
4.Bean的依赖注入
4.1步骤
将UserServiceImpl的创建权交给Spring
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
从Spring容器中获得UserService进行操作
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); userService.save();
4.2Bean的依赖注入方式
配置Spring容器调用有参构造时注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
配置Spring容器调用set方法进行注入
public void setUserDao(UserDao userDao) { this.userDao = userDao; }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean>
set方法P命名空间注入
需先引入p命名空间,其次,修改注入方式
xmlns:p="http://www.springframework.org/schema/p" <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao- ref="userDao"/>
4.3Bean依赖注入的数据类型
普通数据类型的注入
public class UserDaoImpl implements UserDao { private String company; private int age; public void setCompany(String company) { this.company = company; } public void setAge(int age) { this.age = age; } }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="company" value="传智播客"></property> <property name="age" value="15"></property> </bean>
集合数据类型(List
) public class UserDaoImpl implements UserDao { private List<String> strList; public void setStrList(List<String> strList) { this.strList = strList; } }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="strList"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> </bean>
集合数据类型(List
) private List<User> userList; public void setUserList(List<User> userList) { this.userList = userList; }
<bean id="u1" class="com.itheima.domain.User"/> <bean id="u2" class="com.itheima.domain.User"/> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="userList"> <list> <bean class="com.itheima.domain.User"/> <bean class="com.itheima.domain.User"/> <ref bean="u1"/> <ref bean="u2"/> </list> </property> </bean>
集合数据类型(Map<String,User>)
private Map<String,User> userMap; public void setUserMap(Map<String, User> userMap) { this.userMap = userMap; }
<bean id="u1" class="com.itheima.domain.User"/> <bean id="u2" class="com.itheima.domain.User"/> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="userMap"> <map> <entry key="user1" value-ref="u1"/> <entry key="user2" value-ref="u2"/> </map> </property> </bean>
集合数据类型(Properties)
private Properties properties; public void setProperties(Properties properties) { this.properties = properties; }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="properties"> <props> <prop key="p1">aaa</prop> <prop key="p2">bbb</prop> <prop key="p3">ccc</prop> </props> </property> </bean>
4.4引入其他配置文件
<import resource="applicationContext-xxx.xml"/>
5.Spring相关的API
5.1 ApplicationContext的继承体系
接口类型.可通过实例过得Spring容器中的Bean对象
5.2 ApplicationContext的实现类
ClassPathXmlApplicationContext
从类的根路径下加载配置文件(推荐使用)FileSystemXmlApplicationContext
从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。5.3 getBean()方法的使用
//构造方法 public Object getBean(String name) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(name); } public <T> T getBean(Class<T> requiredType) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(requiredType); }
其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。
当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1 = (UserService) applicationContext.getBean("userService");
UserService userService2 = applicationContext.getBean(UserService.class);