1.Spring的Ioc和DI
1.1 Spring简介
Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IOC和AOP为内核。
IOC: 反转控制 AOP:面向切面编程
IOC Inversion of control(控制反转) :将对象的创建权反转给Spring
IOC的方法就是工厂+反射+配置文件
如果想调用其他类,只需要修改配置文件就可以了
//配置文件
<bean id="xxxx" class="xx.xx.xxx.xxx"/>
//工厂
public class BeanFactory {
public static Object getBean(String id) {
// 解析配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml");
// 反射
Class<?> forName = UserDao.class.forName(id);
return forName.newInstance();
}
DI:依赖注入
前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来
一站式框架就是有javaEE每一层解决方案的框架。
**WEB层:**SpringMVC
Service层:Spring层的Bean管理,Spring的声明式事务
DAO层: Spring的jdbc模板,Spring的ORM模块(用于和ORM框架整合,如mybatis)
优势:1)方便解耦,简化开发
2)AOP编程的支持
3)声明式事务的支持
4)方便程序的测试
5)方便集成各种优秀框架
6)降低JavaEE API的使用难度
7)Java源码时经典学习范例
1.2 Spring开发步骤
1)在pom.xml 导入Spring开发的基本包坐标
spring-context
2)编写Dao接口和实现类
3)创建Springle核心配置文件applicationContext.xml
4)在SPringle配置文件中配置UserDaoImpl
5)使用Spring的API获得Bean实例
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
1.3 Spring配置文件
1.3.1 Bean标签基本配置
用于配置对象交由Spring来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
1.id Bean实例在Spring容器中的唯一标识
2.class Bean的全限定名称
3.scope 指对象的作用范围,取值如下
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session | WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当 于 session |
1.3.2 Bean标签范围配置
1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
Bean的生命周期:
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
1.3.3 Bean生命周期配置
init-method 指定类中初始化方法名称
destory-method 指定类中销毁方法名称
1.3.4 Bean实例化三种方式
无参构造方法实例化
会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
<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"/>
1.3.5 Spring的属性注入
1)构造方法的注入
<bean id="user" class="xxx.User">
<constructor-arg name="name" value="老周"/>
<constructor-arg name="age" value="25"/>
</bean>
2) set方法的方式的属性注入
<bean id="user" class="xxx.User">
<property name="name" value="老周"/>
<property name="age" value="25"/>
</bean>
3)SpEL的属性注入
// SpEL:Spring Expression Language,Spring的表达式语言。
<bean id="user" class="xxx.User">
<property name="name" value="#{user.name}"/>
<property name="age" value="#{user.age}"/>
</bean>
4)集合类型的属性注入
①注入数组类型
<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
<!-- 数组类型 -->
<property name="arrs">
<list>
<value>王东</value>
<value>赵洪</value>
<value>李冠希</value>
</list>
</property>
②注入list集合
<!-- 注入list集合 -->
<property name="list">
<list>
<value>李兵</value>
<value>赵如何</value>
<value>邓凤</value>
</list>
</property>
③注入set集合
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
④注入Map集合
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
</bean>
Spring的重点配置
标签
**id属性:**在容器中Bean实例的唯一标识,不允许重复
class属性:要实例化的Bean的全限定名
scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
**标签:**属性注入
name属性:属性名称
**value属性:**注入的普通属性值
**ref属性:**注入的对象引用值
标签
map标签
标签
标签
标签:导入其他的Spring的分文件
1.4 Spring相关API
1.4.1 ApplicationContext 的继承体系
applicationContext:
接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象。
1.4.2 ApplicationContext的实现类
1)ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2)FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3)AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
1.4.3 Spring的重点API
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1 = (UserService) applicationContext.getBean("userService");
UserService userService2 = applicationContext.getBean(UserService.class);
1.5 Spring的注解开发
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,多以注解开发时一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
1.5.1 Spring原始注解
主要是代替的配置
注解开发时,需要在appilcationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标注该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入
使用@Value进行字符串的注入
使用@Scope标注Bean的范围
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
1.5.2 Spring新注解
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 一样 |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
1.6 Spring集成Junit
1.6.1 Spring集成Junit步骤
① 导入spring集成Junit的坐标
② 使用@Runwith注解替换原来的运行期
③ 使用@ContextConfiguration指定配置文件或配置类
④ 使用@Autowired注入需要测试的对象
⑤ 创建测试方法进行测试