Spring中IOC的xml方式的配置
内容回顾:
1、什么是Spring?
Spring是SE、EE开发的一站式框架。
Web层:SpringMVC
Service层:Spring的Bean管理,声明式事务
DAO层:ORM模块,JDBC模板
2、Spring的优点
方便解耦合:IOC
AOP的开发:对程序进行扩展
轻量级框架
方便与其他框架整合
3、Spring的IOC入门
下载Spring的开发包
引入jar包,4个基本包+2个日志包
创建接口和实现类
将接口和实现类交给Spring管理
编写测试类
4、什么是IOC和DI?
IOC:控制反转,将对象的创建权,反转给Spring管理。
DI:依赖注入,前提是在IOC的环境下,Spring创建对象时,会将这个对象所依赖的属性设置进来。
5、Spring的工厂类(了解)
BeanFactory:老版本的工厂类
ApplicationContext:新版本的工厂类
ClassPathXmlApplicationContext:加载src类路径下的配置文件。
FileSystemXmlApplicationContext:加载磁盘路径上的配置文件。
6、Spring中bean标签的配置
id和name属性
生命周期的配置:init-method,destroy-method
scope作用范围属性:
singleton:默认的值,单例模式
prototype:多例模式
7、Spring中Bean的实例方式(了解)
默认无参数构造方法的方式
静态工厂实例化的方式
实例工厂实例化的方式
8、Spring的属性注入方式
构造方法属性注入
set方法属性注入
p名称空间的属性注入
SpEL表达式的属性注入
集合属性的注入
9、Spring的整合web项目
演示Spring和web项目中一些问题:
每次请求都会创建Spring的工厂,浪费服务器资源。
解决方案:
在服务器启动的时候创建Spring的工厂。
将工厂保存到ServletContext中,即整个项目都能访问到。
每次获取工厂的时候从ServletContext中获取获取。
整合web项目:
引入spring_web.jar。
配置ContextLoaderListener。
默认加载的是/WEB-INF/applicationContext.xml。
需要配置修改加载配置文件的路径。
通过工具类获取工厂。
Spring中IOC的注解方式的配置
1、创建web项目,引入jar包,配置文件
在Spring4的版本中,除了引入4个基本包,2个日志包外,还需要引入aop的包。
在src下引入log4j.properties日志属性文件。
在src下新建applicationContext文件。
去Spring框架开发包中找对应的约束文件的写法。
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html中,倒数第几个,context的约束。
2、编写配置文件约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
3、编写实体类,接口,实现类
实体类:
package com.pipi.spring.demo2;
public class User {
private String name;
private String password;
// setter and getter,构造方法,重写toString()
}
Service层:
package com.pipi.spring.demo2;
public interface UserService {
void save(User user);
}
package com.pipi.spring.demo2;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userDao")
private UserDao userDao;
@PostConstruct // 相当于init-method="init"
public void init() {
System.out.println("UserServiceImpl中的init()初始化方法执行了!");
}
@PreDestroy // 相当于destroy-method="destroy"
public void destroy() {
System.out.println("UserServiceImpl中的destroy()销毁方法执行了!");
}
@Override
public void save(User user) {
System.out.println("UserServiceImpl中的save()方法执行了!");
userDao.save(user);
}
}
Dao层:
package com.pipi.spring.demo2;
public interface UserDao {
void save(User user);
}
package com.pipi.spring.demo2;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
System.out.println("UserDaoImpl中的save()方法执行了!" + user);
}
}
4、编写配置文件
经过我测试,好像核心配置文件中只能有一个<context: />标签。
即不能在分模块中使用<context: />标签,不然会有多个。
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.pipi.spring.demo2" />
5、编写测试类
@Test
public void test01() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save(new User("张三", "aaa123"));
}
IOC注解方式的属性注入
注解方式:使用注解方式的属性注入,可以没有set()方法
属性如果有set方法,需要将属性注入的注解,添加到set方法上。
属性如果没有set方法,需要将属性注入的注解,添加到属性上。
Spring的IOC注解详解
1、@Component:组件
修饰一个类,功能是将这个类交给Spring管理。
这个注解有三个衍生注解(目前功能类似,以便后期扩展):
@Controller :注解web层的类
@Service :注解service层的类
@Repository :注解dao层的类
2、属性注入的注解
普通属性:
@Value :设置普通属性的值
对象类型属性:
@Autowired :设置对象类型属性的值,但是它是按照类型完成属性注入。
而我们习惯是按照名称完成属性注入:此时需要@Autowired和@Qualifier一起使用,按照名称完成属性注入。
@Resource :功能是@AutoWired和@Qualifier的替代品,不是Spring中的注解,而是Spring实现的一套规范中,javax中的注解(java EE6中的javax.annotation.Resource)。
3、Bean的其他注解
(1)生命周期相关的注解(了解):
@PostConstruct :初始化方法的注解
@PreDestroy :销毁方法的注解
(2)Bean的作用范围的注解
@Scope :作用范围
取值有:singleton(默认值单例),prototype(多例),request,session,globalsession。
4、IOC的XML和注解开发的比较
适用场景:
XML:基本可以适用任何地方。
注解:有些地方用不了,比如有些类不是自己定义的。你无法在源代码中加@Resource。
XML配置:结构清晰,哪些类交给了框架管理,注入了哪些属性,一目了然,便于维护。
注解配置:编写配置方便,但结构不清晰,需要看源代码。
XML和注解一起使用的开发方式(各取所长):XML管理Bean,注解完成属性注入。