目录
1.spring核心内容大概解读
2.spring的IOC(控制反转容器机制剖析)
2.1 来份快速入门案例
2.2 debug剖析spring容器的机制和结构
1.spring核心内容大概解读
解释一下:
1. IOC(Inversion of control):控制反转,可以用来管理java对象
2. AOP:切面编程
3.JDBCTemplate:是spring提供的一种访问数据库的技术。
4.声明式事务:基于ioc/aop实现的事务管理。
5.Spring可以整合其他框架,如Spring Boot,SSM这些框架都是基于Spring实现的,简而言之,就是Spring是来管理框架的框架。
来看看IOC的控制反转是什么概念
1.传统的开发模式比如说反射,或者通过配置文件读取信息连接数据库等。他们都是程序----->环境
也就是程序先读取环境配置,然后创建对象,在进行操作。
2.而现在的IOC控制反转开发模式呢: 是首先将你要创建的对象,通过文件/XML,或者注解的形式创建在容器中,你可以将容器想象成集合。当你要使用某个对象实例的时候,直接从容器中拿,就不需要new 一个对象的形式了。
1 、 Spring 根据配置文件 xml/ 注解 , 创建对象, 并放入到容器 (ConcurrentHashMap) 中 ,并且可以完成对象之间的 依赖2 、当需要使用某个对象实例的时候 , 就直接从容器中获取即可3 、程序员可以更加关注如何使用对象完成相应的业务 , ( 以前是 new ... ==> 注解 / 配置方式 )4. Spring 最大的价值,通过配置,给程序提供需要使用的web 层[Servlet(Action/Controller)]/Service/Dao/[JavaBean/entity]对象,
这个是核心价值所在,也是 ioc 的具体体现, 实现解耦
2.spring的IOC(控制反转容器机制剖析)
2.1 来份快速入门案例
spring容器从配置文件/xml中获取对象,并输出该对象相关信息的案例
输出结果:
Monster类
package spring.bean;
/**
* @author sn
*/
public class Monster {
private Integer id;
private String name;
private String skill;
//写一个无参构造函数,spring是用反射来创建对象的
public Monster() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
@Override
public String toString() {
return "Monster{" +
"id=" + id +
", name='" + name + '\'' +
", skill='" + skill + '\'' +
'}';
}
}
beans.xml文件的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
1.配置Monster对象/javabean
2.在beans中可以配置多个bean
3.class属性指定的是类的全路径
4.id属性表示java对象在spring容器中的id,通过id可以获取对象
5.<property name="skill" value="向阳而生"/>是用来给该对象赋值
-->
<bean class="spring.bean.Monster" id="monster01">
<property name="id" value="1"/>
<property name="name" value="小红花"/>
<property name="skill" value="向阳而生"/>
</bean>
</beans>
测试案例
@Test
public void getMonster() {
//1. 创建容器 ApplicationContext
//2. 该容器和容器配置文件关联
ApplicationContext ioc =
new ClassPathXmlApplicationContext("beans.xml");
//3. 通过getBean获取对应的对象
// 默认返回的是Object , 但是运行类型Monster
//Object monster01 = ioc.getBean("monster01");
Monster monster01 = (Monster) ioc.getBean("monster01");
//4. 输出
System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());
System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +
" id=" + monster01.getId());
//5. 也可以再获取的时候,直接指定Class类型, 可以在次获取
Monster monster011 = ioc.getBean("monster01", Monster.class);
System.out.println("monster011=" + monster011);
System.out.println("monster011.name=" + monster011.getName());
//6. 查看容器注入了哪些bean对象,会输出bean的id
System.out.println("================================");
String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println("beanDefinitionName=" + beanDefinitionName);
}
System.out.println("================================");
System.out.println("ok~~~");
}
具体解释
该容器就是通过上述案例中为ioc的对象
问题1:如何通过ClassPathXmlApplicationContext("beans.xml")读取到xml文件的?
ClassPath也成为类的加载路径。当运行程序的时候会默认以类的加载路径去读取xml文件的
类的加载路径怎么看
@Test
public void classPath()
{
File file = new File(this.getClass().getResource("/").getPath());
System.out.println("file=>"+file);
}
结果:
由上图我们可知道他默认读取到的就是项目在运行后的out/production/spring_/spring下的beans.xml文件
2.2 debug剖析spring容器的机制和结构
代码都是上述案例的代码
debug过后可以看到
在beanDefinitionMap中存放的是beans.xml中所有bean对象的信息。
目的是:如果不是单例对象,以后通过这些信息,反射创建该对象
你咋知道这里面存放的不是bean对象呢
在val中我们可以看到是通用的类的定义,并不是一个实例
bean对象的实例放在哪儿呢,继续看
在这里啊我们就可以看到是一个Monster对象 ,实例是放在singletonObjects里面的
注意的是,spring容器的创建会消耗大量资源,尽量不要多创,将你要用到的对象信息,放在同一个xml文件中即可。
后续spring的更新不断,请大伙多多支持!
本篇文章来自Java高级工程师韩顺平教育学习心得,如有版权问题及时删除。