【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
文章目录
- 🌍一. spring学习的核心内容
- 🌍二. 基于 XML 配置 bean
- 1. 通过类型来获取 bean
- 2. 通过构造器配置 bean
- 3. 通过 p 名称空间配置 bean
- 4. 引用/注入其它 bean 对象
- 5. 引用/注入内部 bean 对象
- 6. 引用/注入集合/数组类型
- 7. 级联属性赋值
- 8. 通过静态工厂获取对象
- 9. 通过实例工厂获取对象
- 10. 通过 FactoryBean 获取对象(重点)
- 11. bean 配置信息重用(继承)
🙋♂️ 作者:@whisperrr.🙋♂️
👀 专栏:spring👀
💥 标题:【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean💥
❣️ 寄语:比较是偷走幸福的小偷❣️
🌍一. spring学习的核心内容
- Spring 核心学习内容 IOC、AOP, jdbcTemplate, 声明式事务
- IOC: 控制反转 , 可以管理 java 对象
- AOP : 切面编程
- JDBCTemplate : 是 spring 提供一套访问数据库的技术, 应用性强,相对好理解
- 声明式事务: 基于 ioc/aop 实现事务管理,
Spring 几个重要概念
Spring 可以整合其他的框架(解读: Spring 是管理框架的框架)
Spring 有两个核心的概念: IOC 和 AOP
IOC [Inversion Of Control 反转控制]
2.为什么学习spring,我们看一下传统的开发模式
上图连接到数据库为例说明
程序员编写程序, 在程序中读取配置信息
创建对象, new Object???() // 反射方式
使用对象完成任务
而IOC 的开发模式 [EmpAction EmpService EmpDao Emp]程序 注解/配置方式)
4.DI—Dependency Injection 依赖注入,可以理解成是 IOC 的另外叫法.
5.Spring 最大的价值,通过配置,给程序提供需要使用的web 层[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]对象,这个是核心价值所在,也是 ioc 的具体体现, 实现解耦.
3.Debug 看一下 Spring 容器的处理机制,
Spring管理 Bean-IOC
Bean管理包括两方面,创建 bean 对象和给 bean 注入属性,Bean 配置方式也有两种,基于 xml 文件配置方式和基于注解方式
🌍二. 基于 XML 配置 bean
1. 通过类型来获取 bean
通过 spring 的 ioc 容器, 获取一个 bean 对象
- 创建 Monster.java
- 在 beans.xml 配置(说明前面已经配置好了)
解读:
1. 配置monster对象/javabean
2. 在beans中可以配置多个bean
3. bean表示就是一个java对象
4. class属性是用于指定类的全路径->spring底层使用反射创建
5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象
6. 用于给该对象的属性赋值
完成测试
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster = ioc.getBean(Monster.class);
细节说明
- 按类型来获取 bean, 要求 ioc 容器中的同一个类的 bean 只能有一个, 否则会抛出异常
NoUniqueBeanDefinitionException
- 这种方式的应用场景:比如 XxxAction/Servlet/Controller, 或 XxxService 在一个线程
中只需要一个对象实例(单例)的情况
- 说明一下: 在容器配置文件(比如 beans.xml)中给属性赋值, 底层是通过
setter 方法完成的, 这也是为什么我们需要提供 setter 方法的原因
2. 通过构造器配置 bean
在 spring 的 ioc 容器, 可以通过构造器来配置 bean 对象
解读
1. constructor-arg标签可以指定使用构造器的参数
2. index表示构造器的第几个参数 从0开始计算的
3. 除了可以通过index 还可以通过 name / type 来指定参数方式
4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定
数据类型就是对应的 Java 数据类型,按构造器参数顺序
完成测试
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Object monster02 = ioc.getBean("monster02"); Object monster03 = ioc.getBean("monster03");
通过 index 属性来区分是第几个参数
通过 type 属性来区分是什么类型(按照顺序)
3. 通过 p 名称空间配置 bean
在 spring 的 ioc 容器, 可以通过 p 名称空间来配置 bean 对象
完成步骤
- 在 beans.xml 配置, 增加命名空间配置
- xmlns:p="http://www.springframework.org/schema/p"
1.将光标放在p , 输入alt+enter , 就会自动的添加xmlns
2.有时需要多来几次
p:monsterId="4" p:name="红孩儿" p:skill="吐火~" />
完成测试
ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Monster monster04 = ioc.getBean("monster04", Monster.class);
4. 引用/注入其它 bean 对象
在 spring 的 ioc 容器, 可以通过 ref 来实现 bean 对象的相互引用
- 其它含义和前面一样
- ref 表示 memberDAO 这个属性将引用/指向 id = memberDAOImpl 对象
解读
1.ref="memberDAO"表示 MemberServiceImpl对象属性memberDAO引用的对象是id=memberDAO 的对象
2.这里就体现出spring容器的依赖注入
3.注意再spring容器中, 他是作为一个整体来执行的, 即如果你引用到一个bean对象, 对你配置的顺序没有要求
4.建议还是按顺序,好处是阅读的时候,比较方便
5. 引用/注入内部 bean 对象
6. 引用/注入集合/数组类型
给 bean 对象的 list 集合赋值
给 bean 对象的 map 集合赋值
monsterKey01 monsterKey02
给 bean 对象的 properties 集合赋值 结构k(String)-v(String)
Java 工程师 前端工程师 大数据工程师
给 bean 对象的数组属性注入值 ,array标签中使用 value 还是 bean , ref … 要根据你的业务决定
银角大王 金角大王
给 bean 对象的 set 属性注入值
1.主要掌握 List/Map/Properties 三种集合的使用.
2.Properties 集合的特点
1)这个 Properties 是 Hashtable 的子类 , 是 key-value 的形式
2)key 是 string 而 value 也是 string
7. 级联属性赋值
spring 的 ioc 容器, 可以直接给对象属性的属性赋值, 即级联属性赋值
8. 通过静态工厂获取对象
先创建一个静态工厂
public class MyStaticFactory { private static Map monsterMap; static { monsterMap = new HashMap(); monsterMap.put("monster_01", new Monster(100, "黄袍怪", "一阳指")); monsterMap.put("monster_02", new Monster(200, "九头金雕", "如来神掌")); } public static Monster getMonster(String key) { return monsterMap.get(key); } }
修改 beans.xml , 增加配置
1 通过静态工厂获取/配置bean
2. class 是静态工厂类的全路径
3. factory-method 表示是指定静态工厂类的哪个方法返回对象
4. constructor-arg value=“monster02” value是指定要返回静态工厂的哪个对象
通过这个静态工厂获取的对象是同一个
9. 通过实例工厂获取对象
在 spring 的 ioc 容器, 可以通过实例工厂获取 bean 对象
public class MyInstanceFactory { private Map monster_map; //非静态代码块 { monster_map = new HashMap(); monster_map.put("monster_01", new Monster(100, "猴子精", "吃人")); monster_map.put("monster_02", new Monster(200, "九头金雕", "如来神掌")); } public Monster getMonster(String key) { return monster_map.get(key); } }
配置 beans.xm
1.factory-bean 指定使用哪个实例工厂对象返回bean
2. factory-method 指定使用实例工厂对象的哪个方法返回bean
3. constructor-arg value=“monster03” 指定获取到实例工厂中的哪个monster
通过这个实例工厂获取的对象是同一个,如果创建两次实例工厂,再分别获取对象就不是同一个,这是和静态工厂的区别。
10. 通过 FactoryBean 获取对象(重点)
public class MyFactoryBean implements FactoryBean { private String keyVal; private Map monster_map; { monster_map = new HashMap(); monster_map.put("monster_01", new Monster(100, "黄袍怪", "一阳指")); monster_map.put("monster_02", new Monster(200, "九头金雕", "如来神掌")); } public void setKeyVal(String keyVal) { this.keyVal = keyVal; } @Override public Monster getObject() throws Exception { // TODO Auto-generated method stub return this.monster_map.get(keyVal); } @Override public Class getObjectType() { // TODO Auto-generated method stub return Monster.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
解读
1.通过 FactoryBean 来获取 bean 对象
2.name=“keyVal” 就是 MyFactoryBean 定义的 setKeyVal 方法
3.value=“monster_01” ,就是给 keyVal 的值
11. bean 配置信息重用(继承)
在 spring 的 ioc 容器, 提供了一种继承的方式来实现 bean 配置信息的重用