spring详解:
spring 是一个轻量级的控制反转(IOPC)和面向切面(AOP)的容器框架;
spring IOC
IOC是控制反转 是指将对象的创建权反转给spring 作用是实现了程序的解耦合
案例:
1, 创建一个对象
package com.zhang.bean;
public class User{
private String username;
private String passworld;
get / set .....
}
2, 书写配置注册对象到容器
创建xml文件 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!--将User对象交给spring容器管理 ,其中name任意,class为全包名-->
<bean name="user" class="com.sjtu.bean.User"></bean>
</beans>
3, 代码测试
@Test
public void fun1(){
//创建容器对象
ApplicationContext fn = new ClassPathXmlApplicationContext("applicationContext.xml");
//想容器 要user对象
user u = (user)fn.getBean("user");
System.out.printIn(u);
}
spring IOC :
控制反转 简单点说就是创建对象的控制权 ,被反转到Spring框架
通常我们实例化一个对象时 都是使用类的构造方法来new一个对象 这个过程是由我们自己控制来的,而控制反转就是将new对象的工作交给spring容器
IOC 的主要实现两种:依赖注入和依赖查找。
依赖查找,主要是容器为组件提供一个回调接口和上下文环境。这样一来,组件就必须自己使用容器提供的API来查找资源和协作对象,控制反转仅体现在那些回调方法上,容器调用这些回调方法,从而应用代码获取到资源。
依赖注入,组件不做定位查询,只提供标准的Java方法让容器去决定依赖关系。容器全权负责组件的装配,把符合依赖关系的对象通过Java Bean属性或构造方法传递给需要的对象。
spring AOP:
面向切面
就是纵向编程 比如业务A和业务B现在需要一个相同的操作,传统方法我们可以写出相同的代码操作,而应用AOP就可以只写一遍代码,A,B公用这段代码, 并且 当AB需要增加新的操作时,可以在不动源代码的情况下,灵活添加新的业务逻辑代码。
在实际的开发中AOP主要应用于签名验签,参数校验,日志记录,事务控制,权限控制,异常处理。
applicationContext 和 BeanFactory
BeanFactory接口
spring原始接口,最底层的接口,针对原始接口的实现类功能较为单一。
BeanFactory接口实现类的容器,特点是每次在获得对象时候才创建对象,为了节省内存。
ApplicationContext
每次容器启动时就会创建容器中的配置的所有
从类路径下加载配置文件
从硬盘绝对路径下加载配置文件
Bean 的详解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!--将User对象交给spring容器管理 ,其中name任意,class为全包名
class属性:被管理对象的完整类名
name属性:给被管理的对象起个名字,根据该名称获得对象
可以重复,可以使用特殊字符
id属性:与name属性一模一样
名称不可重复,不能使用特殊字符
结论:尽量使用name属性
-->
<bean name="user" class="com.zhang.bean.User"></bean>
</beans>
Spring 创建对象的三种方式
1
》空参创建
<beab name="user" class="com.zhang.bean.user"></bean>
2》创建容器对象 相对于src下路径
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
3》静态工厂
public static User crateUser(){
System.out.printIn("惊涛工厂创建user");//表示由用户自己创建
return new User();
}
<!--创建方式2:创建工厂创建方式 调用UserFactory的createUser 方法创建名为user2的对象放入容器-->
<bean name="user2" class="com.zhang.create.UserFactory" factory-method="createUser"></bean>
//测试
public void fun2(){
ApplicationContext ac = new ClassPathXmlApplicationContext("com/zhang/b_create/applicationContext.xml");
User u = (user) ac.getBean("user2");
}
4》实例化工厂
public User createUser2(){
System.out.printIn("实例化工厂创建User");
return new User();
}
<!--创建方式3:实例工厂创建 调用UserFactory对象的createUser2方法创建名为user3的对象,放入容器 -->
<bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean>
<bean name="userFactory" class="com.zhang.b_create.UserFactory" ></bean>
生命周期
配置一个方法作为生命周期初始化方法spring 会在对象创建之后立即调用
init-method
配置一个方法作为生命周期的销毁方法 spring 容器在关闭并销毁所有容器中的对象之前调用
destory-method
//并在User中实现此方法
public void init() {
System.out.println(“初始化”);
}
public void destroy() {
System.out.println("销毁");
}
分模块配置
主配置文件引入其他配置文件
//在主配置文件中做如下配置
属性注入
set 方法注入(重要 前提是set注入之前该对象提供setter方法)
<bean name="car" class="com.sjtu.bean.Car">
<property name="name" value="兰博基尼"></property>
<property name="color" value="黄色"></property>
</bean>