Spring——控制反转(IOC)和面向切面(AOP)
可以将所有的对象创建和依赖关系维护交给Spring管理的AOP编程支持
Spring 提供的切面编程可以方便的实现对程序进行权限拦截,运行监控等声明式事物的支持。
Spring支持Junit4,方便测试。
IOC的底层实现原理
IOC将对象的创建权反转给Spring,实现程序的解耦合。
spring是轻量级开源框架
spring核心有两部分:
(1)控制反转 ioc:
* 比如现在有普通类,在这个类里面有普通的方法,调用这个类里面的普通的方法,需要创建类对象,使用对象调用方法。
* 创建类的对象,使用原始方式new对象。使用ioc实现对象创建,不需要手动new对象,通过配置文件方式创建对象
** 把对象创建交给spring配置
(2)面向切面 aop:
* 不通过修改源代码方式增强类里面的方法
* aop底层动态代理
spring是一站式框架
(1)spring针对javaee三层,在每一层提供解决技术
* web层:springMVC
* service层: spring ioc
* dao层:spring jdbcTemplate
ioc称为控制反转,把对象创建不是new出来,而是在spring使用配置方式创建
IOC入门案例
1 创建普通类,在这个类里面创建普通的方法,调用类里面的方法
第一步 导入spring相关jar包 (1)使用spring框架,核心有四个部分(四个jar包) * beans:spring配置文件相关配置 * core:核心部分 * context:spring注解 * SpEL : spring表达式 第二步 创建类,创建普通的方法
第三步 创建spring配置文件,配置user对象创建 在spring配置文件配置对象 <!-- 配置user对象 id: 根据id值获取对象 class: 要创建对象所在类全路径 --> <bean id="user" class="cn.itcast.ioctest.User"></bean>
第四步 测试如何获取配置出来的user对象 @Test public void testUser() { //1 加载spring配置文件 /* * 加载spring配置文件,把配置对象创建 * */ ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2 根据id值获取对象 // User user1 = context.getBean("user",User.class); User user = (User) context.getBean("user"); System.out.println(user); user.add(); }
|
Spring的bean管理(xml方式)
什么是bean管理
两个操作:
(1)创建对象(bean实例化)
(2)设置类里面属性值(注入属性)
spring的bean管理有两种方式
(1)基于xml配置文件方式
(2)基于注解方式
1 在spring里面通过配置文件创建对象 (1)创建对象操作
2 bean实例化(创建对象)三种方式实现 第一种 使用类的无参数构造创建(重点)
第二种 使用静态工厂创建(了解) (1)创建静态的方法,返回类对象
第三种 使用实例工厂创建(了解) (1)创建不是静态的方法,返回类对象 |
bean标签常用属性
1 id属性 (1)根据id属性值获取对象 (2)在一个spring配置文件中,可以有多个bean标签,但是bean标签id属性值不同
2 class属性 (1)类的全路径
3 name属性 (1)name属性作用和id属性一样的 (2)id属性值里面不能包含特殊符号的 (3)name属性值可以包含特殊符号 /user
4 scope属性 (1)主要作用:配置创建对象是单实例还是多实例对象 (2)属性值: * 默认值,singleton,表示单实例对象 * prototype,表示多实例对象 ** action是多实例对象
request:把创建对象放到request里面 session:把创建对象放到session里面 globalSession:把创建对象放到globalSession里面 ** 单点登录 |
spring配置文件在服务器启动时候加载最合适,创建对象
底层原理:
* ServletContext对象:当服务器启动时候,每个项目有一个ServletContext对象,是整个web项目范围的域对象
* 监听器:监听ServletContext对象创建和销毁
(2)在开发中,一般让配置文件在服务器启动时候加载,把配置文件中对象创建
Bean生命周期配置(了解)
1 创建servlet时候,执行init方法 2 销毁servlet时候,执行destory方法
|
属性注入介绍
1 在类里面有属性,向类里面属性中设置值,这个过程称为属性注入
2 向类里面属性中设置值,在java代码中有三种方式实现
3 spring框架里面支持是set方法注入和有参数构造注入 (1)常用set方法注入 |
使用有参数构造注入
1 创建类,定义属性,生成有参数构造 /** * 有参数构造注入 * @author asus * */ public class Book { private String bname; private String author;
//生成有参数构造 public Book(String bname, String author) { this.bname = bname; this.author = author; }
public void add() { System.out.println("book:"+bname+"::"+author); } }
2 配置属性注入 <!-- 使用有参数构造注入 --> <bean id="book" class="cn.itcast.attr.Book"> <!-- 体现有参数构造 name: 属性名称 value:设置值 --> <constructor-arg name="bname" value="易筋经"></constructor-arg> <constructor-arg name="author" value="小王"></constructor-arg> </bean> |
使用set方法注入(重点)
1 创建类,定义属性,生成属性set方法 /** * set方法注入 * @author asus * */ public class Orders {
private String oname; private String oaddress; //生成set方法 public void setOname(String oname) { this.oname = oname; } public void setOaddress(String oaddress) { this.oaddress = oaddress; }
public void add() { System.out.println("orders:"+oname+"::"+oaddress); } }
2 配置属性注入 <!-- set方法注入 --> <bean id="orders" class="cn.itcast.attr.Orders"> <!-- name: 属性名称 value:设置值 --> <property name="oname" value="洗髓经"></property> <property name="oaddress" value="嵩山"></property> </bean> |
注入对象类型属性(重点)
第一步 在service定义dao类型属性 public class UserService {
//目的:在service获取dao对象 //把dao对象注入到service
//1 定义UserDao类型属性 private UserDao userDao; //2 生成set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; }
第二步 实现配置
|
p名称空间注入(了解)
1 引入p名称空间 2 配置文件中,使用名称空间注入属性
(1)spring2.x以下版本,不能使用p名称空间注入 |
spring分模块配置开发
1 在代码里面加载配置时候时候,引入多个配置文件
2 在配置文件引入其他spring配置文件 |
注入复杂类型属性(会用)
1 数组 2 List集合 3 Map集合 4 Properties /** * 复杂类型属性 * @author asus * */ public class Customer {
//定义属性 private String[] arrs; private List<String> list; private Map<String,String> map; private Properties properties; //set方法 public void setArrs(String[] arrs) { this.arrs = arrs; } public void setList(List<String> list) { this.list = list; } public void setMap(Map<String, String> map) { this.map = map; } public void setProperties(Properties properties) { this.properties = properties; }
public void find() { System.out.println("arrs: "+Arrays.toString(arrs)); System.out.println("list: "+list); System.out.println("map: "+map); System.out.println("properties: "+properties); } }
<bean id="customer" class="cn.itcast.attr.Customer"> <!-- 数组 --> <property name="arrs"> <list> <value>lucy</value> <value>mary</value> <value>jack</value> </list> </property>
<!-- list --> <property name="list"> <list> <value>小王</value> <value>小金</value> <value>小奥</value> </list> </property>
<!-- map--> <property name="map"> <map> <entry key="football" value="足球"></entry> <entry key="basketball" value="篮球"></entry> </map> </property>
<!-- properties --> <property name="properties"> <props> <prop key="driverClass">com.mysql.jdbc.Driver</prop> <prop key="jdbcUrl">jdbc:mysql:///day01</prop> </props> </property> </bean>
|
IOC和DI区别
1 ioc:控制反转,把对象创建不是new出来的,通过spring配置出来的 (1)spring创建对象
2 di:依赖注入 (1)属性注入,向类里面属性中设置值
3 ioc和di关系: (1)di需要在ioc基础之上完成 (2)向类里面设置属性值,首先创建类的对象,使用对象才可以设置 |