1.Spring概述
- 轻量级开源的JavaEE框架
- Spring的两大核心IOC,AOP
- IOC控制反转,把创建对象的过程交给Spring管理
- Aop面向切面,在不修改源代码的基础上增加功能
- 使用Spring降低代码的耦合度,简化开发
2.IOP概述
- 控制反转,创建对象及其调用的过程都交给Spring去实现
- 常见的两种实现方式为xml解析或注解开发
2.1底层原理
- IOC思想基于IOC容器,IOC容器的底层就是对象工厂
1 2 3 4 5 6 7 8 9 10
| <bean id="flag" class="com.User"></bean>
public static User getUser(){ String classValue = class属性值; Class<?> aClass = Class.forName(classValue); return (User) aClass.newInstance(); }
|
2.2加载配置接口
- ApplicationContext:BeanFactory的子接口,提供更丰富的功能,饿汉式
- BeanFactory:Spring内部使用接口,加载配置文件不会创建对象,获取对象时才创建 懒汉式
1 2 3 4 5 6
| new FileSystemXmlApplicationContext(); new ClassPathXmlApplicationContext(); ApplicationContext acs = new ClassPathXmlApplicationContext("xml文件");
User user = acs.getBean("xml中配置的id值", User.class);
|
3.Bean管理
- Spring创建对象和spring注入属性构成bean管理
- 两种管理方式:基于xml配置文件实现,基于注解方式实现
3.1xml注入格式
使用set注入
1 2 3 4
| <bean id="类标识" class="类路径"> <property name="属性名称" value="注入属性值"/> </bean>
|
有参构造注入
1 2 3
| <bean id="类标识" class="类路径"> <constructor-arg name="属性名称" value="注入属性值"/> </bean>
|
通过P标签注入
1 2 3 4 5 6 7 8 9 10 11 12
| <beans xmlns:p="http://www.springframework.org/schema/p"/> <bean id="order" class="Orders" p:属性名称="注入属性值"> <property name="orderName"> <null/> </property> <property name="orderAddress"> <value><![CDATA[<南京>]]></value> </property> </bean>
|
3.2外部Bean
1 2 3 4 5 6 7
| <bean id="类标识" class="类路径">
<property name="userDao" ref="userDaoImpl"/> </bean> <bean id="userDaoImpl" class="com.dao.UserDaoImpl"/>
|
3.3内部Bean
1 2 3 4 5 6 7 8 9
| <bean id="employee" class="com.ltd.Staff"> <property name="name" value="小明"/> <property name="dept"> <bean class="com.ltd.Department"> <property name="dname" value="人事部"/> </bean> </property> </bean>
|
级联赋值
1 2 3 4 5 6 7 8 9 10
| <bean id="employee2" class="com.ltd.Staff"> <property name="name" value="汤姆"/> <property name="dept" ref="dept"/> <property name="dept.dname" value="技术部"/> </bean> <bean id="dept" class="com.ltd.Department"> <property name="dname" value="研发部"/> </bean>
|
3.4注入属性集合
集合与数组类型注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <property name="类中属性名称"> <数组用array 集合用list或set> <value>属性值</value> </array|list|set> </property>
<property name="map"> <map> <entry key="Subject" value="java"></entry> <entry key="爬虫" value="Python"></entry> </map> </property>
|
引用数据类型注入
1 2 3 4 5 6 7 8 9
| <property name="courseList"> <list> <ref bean="fen1"/> </list> </property> <bean id="fen1" class="collection.Course"> <property name="course_Name" value="线性代数"/> </bean>
|
提取集合注入
1 2 3 4
| <bean xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"/>
|
1 2 3 4 5 6 7 8 9 10 11
|
<util:list id="bookList"> <value>国富论</value> <value>挪威的森林</value> </util:list>
<bean id="book" class="collection.Course"> <property name="list" ref="bookList"/> </bean>
|
4.作用域
- 默认bean创建为单例模式
- 若需设置为多实例模式只需在bean标签中,添加scope属性
1
| <bean id="略" class="略" scope="填4.1中的四种值">
|
4.1Scope值
- singleton,单例,表示通过Spring容器获取的对象是唯一的,是默认值
- prototype,原型,表示通过Spring容器获取的对象是不同的
- request,请求,表示在异常HTTP请求内有效
- session,会话,表示在一个用户会话内有效
4.2使用场景
- request和session一般用于web项目
- singleton模式下,只要加载IOC容器,不管是否从IOC种取出bean,配置文件中的bean都会被创建,而且只会创建一个对象
- prototype模式下,如果不从IOC中取出bean,则不创建对象,取一次bean,就会创建一个对象
5.外部属性文件
- 以数据库线程池druid为例
- 首先配置名称空间context
- 通过名称空间获取配置文件
1 2
| <context:property-placeholder location="配置文件"/>
|
5.1properties文件
1 2 3 4
| druid.driverClassName=com.mysql.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/bank druid.username=root druid.password=123456
|
5.2xml配置文件
1 2 3 4 5 6 7
| <context:property-placeholder location="properties文件"/> <bean id="druidII" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${druid.driverClassName}"/> <property name="url" value="${druid.url}"/> <property name="username" value="${druid.username}"/> <property name="password" value="${druid.password}"/> </bean>
|
6.生命周期
- 通过构造器创建bean实例
- 为bean的属性设置值和对其他bean引入(设置set方法)
- 把bean实例传给bean后置处理器的方法postProcessBeforeInitalization
- 调用bean的初始方法
- 把bean实例传给bean后置处理器的方法postProcessAfterInitalization
- 对象获取到,bean可以使用
- 容器关闭时,调用bean的销毁方法(销毁方法需进行配置)
6.1后置处理器
- 让一个类实现BeanPostProcessor接口,重写里面的方法就得到了一个后置处理器
- postProcessBeforeInitalization方法在初始化前执行
- postProcessAfterInitalization方法在初始化后执行
7.注解注入
- Spring针对bean管理中创建对象提供注解
- 四个注解功能一样,都可以用来创建bean实例
- @Component @Service
- @Controller @Repository
7.1对象注入
- beans标签中引用名称空间context
- 开启组件扫描,可以使用上级目录,或用逗号隔开
1
| <context:component-scanbase-package="com"/>
|
- 在需要创建对象的类上面添加四种注解任意一种
- 注解中value值可不写默认为类名(首字母会小写)
- 使用junit测试使用可以运行成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Repository(value = "helloSpring") <bean id="helloSpring" class="com.class1.HelloSpring"/>
<context:component-scan base-package="com" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
<context:component-scan base-package="com"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan>
|
7.2属性注入
- @Autowired 根据属性类型进行自动装配
- @Qualifier 根据属性名称进行注入
- @Resource 两者皆可注入
- 注:@Resource和以上两者不同在于它为javax包下,若不存在需手动导入包或maven依赖
entity实现类及其接口
1 2 3 4 5 6 7 8
| public interface UserDao {void show();}
@Component(value = "student") public class StudentImpl implements UserDao;
@Component(value = "userDaoImpl1") public class UserDaoImpl implements UserDao;
|
属性注入使用
1 2 3 4 5 6 7 8 9
|
@Autowired @Qualifier(value = "userDaoImpl1") private UserDao userDao;
@Resource(name = "student") private UserDao student;
|
普通属性注入
1 2
| @Value("窗前明月光,疑是地上霜") private String line_chinese;
|
7.3完全注解开发
通过创建一个java类添加注解文件来实现替代掉XML文件
基于xml开发
1 2 3
| <bean id="helloSpring" class="类路径"/> ApplicationContext acs = new ClassPathXmlApplicationContext("xxx.xml");
|
完全基于注解开发效果同上
1 2 3 4 5 6
| @Configuration @ComponentScan(basePackages = {"指定包路径"}) public class SpringConfig {}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
|