IOC
- 什么是IOC?
- IOC: inversion of Control(控制反转:将对象的创建权交给spring)
- DI: 属性注入
spring的工厂类
- BeanFactory: 老版本的工厂类
- BeanFactory: 调用getBean的时候,才会生成类的实例.
- ApplicationContext: 新版本的工厂类
- ApplicationContext: 在加载配置文件的时候,就会将spring管理的类都实例化.
- ApplicationContext有两个实现类
- ClassPathXmlApplicationContext: 加载类路径下的配置文件
- FileSystemXmlApplicationContext: 加载文件系统下的配置文件
spring的Bean的实例化方式(了解)
Bean已经都交给spring管理,spring创建这些类的时候 ,有几种方式:
- 无参构造方法的方式(默认)
<bean id="bean1" class="com.jxust.spring.demo1.Bean1"></bean>
2.静态工厂实例化的方式
3. 实例工厂实例化的方式
spring的属性注入
- 构造方法的方式的属性注入(注意:要设置对象类型的属性时,value要改成ref)
<!-- 构造方法的方式 -->
<bean id="car" class="com.jxust.spring.demo1.Car">
<constructor-arg name="name" value="宝马"/>
<constructor-arg name="price" value="80000"/>
</bean>
- 提供set方法的方式的属性注入
<!-- set方法注入对象类型的属性 -->
<bean id="employee" class="com.jxust.spring.demo1.Employee">
<!-- value:设置普通类型的值,ref:设置其他的类的id或name -->
<property name="name" value="阿涛"/>
<property name="car2" ref="car2"/>
</bean>
- P名称空间的属性注入(spring2.5以后)
- 写法:
- 普通属性 p:属性名=”值”
- 对象属性 p:属性名-ref=”值”
- 先引入P名称空间的约束:
xmlns:p="http://www.springframework.org/schema/p"
- 使用p名称空间:
<!-- 改为p名称空间的方式 -->
<bean id="car2" class="com.jxust.spring.demo1.Car2" p:name="奇瑞QQ" p:price="30000"/>
<bean id="employee" class="com.jxust.spring.demo1.Employee" p:name="李四" p:car2-ref="car2"/>
- SpEL的属性注入(spring3.0以后)
- 语法: #{SpEL}
- 注入对象属性和注入普通属性都是用value
<!--SpEL的属性注入-->
<bean id="carInfo" class="com.jxust.spring.demo1.CarInfo"/>
<bean id="car2" class="com.jxust.spring.demo1.Car2">
<property name="name" value="#{carInfo.name}"/>
<property name="price" value="#{carInfo.calculatorPrice()}"/>
</bean>
<bean id="employee" class="com.jxust.spring.demo1.Employee">
<property name="name" value="#{'李四'}"/>
<property name="car2" value="#{car2}"/>
</bean>
- 集合类型属性注入(略)
spring的分模块开发的配置
- 分模块配置
- 在加载配置文件的时候,加载多个
ApplicationContext applicationContext=new ClassPathXmlApplicationContext( "applicationContext.xml","applicationContext2.xml");
- 在一个配置文件中引入多个配置文件
<import resource="applicationContext2.xml"/>
使用spring的核心监听器ContextLoaderListener(整合web项目)
- 问题描述: 每次请求都会创建一个spring的工厂,浪费服务器资源,应该一个项目只有一个spring的工厂.
- 解决思路:
- 在服务器启动的时候,创建一个spring的工厂.
- 创建完工厂,将这个工厂类保存到ServletContext中.
- 每次使用的时候都从ServletContext中获取.
- 实际解决办法:
*使用ServletContextListener监听ServletContext对象的创建和销毁. - 怎么使用?
- 引入jar包spring-web.jar
- 在web.xml中配置监听器,和加载spring的配置文件
spring的IOC的注解开发
- spring的注解开发需要比之间多引入一个jar包,即aop的jar包
- 在spring的配置文件中引入context约束
- 开启spring的组件扫描(在applicationContext.xml中配置)
<!--使用IOC的注解开发,配置组件扫描(那些包下的类使用IOC的注解)-->
<!--扫描是为了扫描类上的注解-->
<context:component-scan base-package="com.jxust.spring.demo1"/>
- 在类上添加注解(将类交给spring管理)
@Component(“userDao”)
- 设置属性的值(属性注入)
- 注解方式:使用注解方式可以不用提供set方法
- 属性如果有set方法,需要将属性注入的注解添加到set方法上
- 属性如果没有set方法,需要将属性注入的注解添加到属性上
- @Value(“张三”):设置普通属性的值
- @Resource(name=””):完成对象类型的属性的注入
- 注解方式:使用注解方式可以不用提供set方法
IOC的XML和注解开发比较
- 使用场景:
- XML: 可以使用与任何场景,结构清晰,维护方便
- 注解: 有些地方用不了(如某个类不是自己提供的),优点是开发方便
IOC的XML和注解整合开发
- XML管理Bean(不开扫描),注解完成属性注入
- 不开启组件扫描
<context:component-scan base-package””/>
- 开启
<context:annotation-config/>
,此方式可以在没有扫描的情况下,使用属性注入的注解:如@Resource,@Value等
spring的AOP的XML开发
- 引入相关jar包(6个基本开发包,4个aop开发相关的jar包)
- 创建切面类,并交给spring管理
- 创建目标类,并交给spring管理
- 通过AOP的配置完成对目标产生代理aop:config(在spring的配置文件中)
- 通过表达式配置哪些类的哪些方法需要进行增强<aop:pointcut expression=“execution(某些类的某些方法)” id=“pointcut1”/>
- 配置切面<aop:aspect ref=“切面类的id或name”>
- 配置通知类型,并联系切面方法和目标方法<aop:before method=“切面类中的方法” pointcut-ref=“pointcut1”/>
spring的AOP的注解开发
- 引入相关jar包
- 创建切面类,并交给spring管理
- 创建目标类,并交给spring管理
- 在spring的配置文件中开启注解的aop开发aop:aspectj-autoproxy/
- 在切面类上使用注解@Aspect
- 在切面类的方法上使用注解@Before(value=“execution(某些类的某些方法)”)
- (可选)spring的AOP的注解切入点的配置
Spring和junit整合
- 在需要使用test的类上添加如下两个注解
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(“classpath:applicationContext.xml”)
- 在需要注入的属性上添加注解(如果没有可以不添加)
- 使用@Test
JDBC模板的使用
- 常规流程
- 引入相关jar包
- mysql-connector-java.jar
- spring-jdbc.jar
- spring-tx.jar
- 在dao中创建连接池,和jdbc模板(创建模板需要将连接池的数据源注入其中)
- 引入相关jar包
public void demo1(){
// 创建连接池
DriverManagerDataSource dataSource
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
dateSource.setUrl(“jdbc:mysql:///spring4_day03”);
dateSource.sestUserName(“root”);
dateSource.setPassword(“abc”);
//创建jdbc模板
JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
//使用模板更新数据
jdbcTemplate.update(“insert into account values (null,?,?)”,“lisi”,1000d);
* 进一步改进
1. 引入相关jar包
* mysql-connector-java.jar
* spring-jdbc.jar
* spring-tx.jar
2. 将连接池和模板交给spring管理
```
3. 使用模板(通过注入jdbcTemplate属性的方式)(比如:通过注解注入,通过XML并提供属性的set方法的方式注入)
-
再进一步改进(抽取配置到属性文件)
- 在上面的基础上,抽取连接池的配置到属性文件
- 定义一个属性文件
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring4_day03
jdbc.username=root
jdbc.password=abc
2. 在spring的配置文件中引入属性文件
* 引入配置文件的方式(两种)
其中一种:` <context:property-placeholder location=”classpath:jdbc.properties”/>`
* 引入属性文件的值 ${key}
```
<bean id="dataSource" class="org.springframework.jdbc.datasource.DrivermanagerDataSource">
<!--属性注入-->
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
```
来源:https://blog.csdn.net/qq_44607214/article/details/99691374