做网站可以申请个体户么,网站的定位分析,时事新闻最新2022,郑州市中原区建设局网站Spring 的基本概述
Spring学习的核心内容—一图胜千言 IOC#xff1a;控制反转#xff0c;可以管理 Java 对象AOP#xff1a;切面编程JDBCTemplate#xff1a;是Spring提供一套访问数据库的技术#xff0c;应用性强#xff0c;相对好理解声明式事务#xff1a;基于IOC …Spring 的基本概述
Spring学习的核心内容—一图胜千言 IOC控制反转可以管理 Java 对象AOP切面编程JDBCTemplate是Spring提供一套访问数据库的技术应用性强相对好理解声明式事务基于IOC / AOP实现事务管理 Spring的几个重要概念
1、Spring可以整合其他的框架Spring是管理框架的框架
2、Spring有两个核心的概念IOC和AOP
3、IOCInversion Of Control 控制反转
传统的开发模式JdbcUtils / 反射 程序 — 环境程序读取环境配置然后自己创建对象 1、程序员编写程序在程序中读取到配置信息 2、创建对象new Object() // 反射方式 3、使用对象完成任务 IOC的开发模式 程序 — 容器容器创建好对象程序直接使用 1、Spring 根据配置文件XML / 注解来创建对象并放入到容器ConcurrentHashMap中并且可以完成对象之间的依赖 2、当需要使用某个对象实例的时候就直接从容器中获取即可 3、程序员可以更加关心如果使用对象完成相应的业务以前是new 注解 / 配置方式 4、DI—Dependency Injection 依赖注入是实现IOC的一种方法
5、Spring最大的价值通过配置给程序提供需要使用的web层[ ServletAction / Controller ]/Service/Dao/[ JavaBean/Entity ]对象
这个是核心价值所在也是IOC的具体体现实现解耦 Spring的快速入门
需求说明
通过 Spring 的方式配置文件获取 JavaBeanMonster的对象并给该对象属性赋值输出该对象信息 完成步骤
下载Spring的开发包https://spring.io/projects/spring-framework#learn 代码实现
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:phttp://www.springframework.org/schema/pxmlns:utilhttp://www.springframework.org/schema/utilxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttps://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd!--1. 配置monster对象2. 在beans中可以配置多个bean3. bean表示就是一个java对象4. class属性是用于指定类的全路径 - Spring底层使用反射创建5. id属性表示该Java对象在Spring容器中的id通过id可以获取到该对象6. property namemonsterId value100/ 用于给该对象的属性赋值--bean classcom.zan.spring.bean.Monster idmonster01!-- bean classcom.zan.spring.bean.Monster--property namemonsterId value100/property namename value牛魔王/property nameskill value芭蕉扇//bean/beanspublic class SpringBeanTest {Testpublic void getMonster() {// 1. 创建容器 ApplicationContext// 2. 该容器和容器配置文件是相关联的 - 读取到的是out文件夹下的beans.xml文件ApplicationContext iocContext new ClassPathXmlApplicationContext(beans.xml);// 3. 通过getBean获取对应的对象传入ID// 默认返回的是Object但是运行类型是Monster
// Object monster01 iocContext.getBean(monster01);Monster monster01 (Monster) iocContext.getBean(monster01);// 4. 输出System.out.println(monster01 monster01 运行类型 monster01.getClass());System.out.println(monster01 monster01 获取对应的属性name monster01.getName());// 5. 也可以在获取的时候直接指定Class类型可以再次获取Monster monster011 iocContext.getBean(monster01, Monster.class);System.out.println(monster011 monster011);System.out.println(monster011.name monster011.getName());// 6. 查看容器注入了哪些bean对象获取所有的beanNameString[] beanDefinitionNames iocContext.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}System.out.println(ok~~~);}// 验证类加载路径Testpublic void classPath() {File file new File(this.getClass().getResource(/).getPath());// 看到类的加载路径System.out.println(file file);// file D:\Code\Java\Learn\Spring\spring-review\out\production\spring-review}
}Debug查看Spring容器结构/机制 手动开发 - 简单的Spring基于XML配置的程序
需求说明
自己写一个简单的Spring容器, 通过读取beans.xml获取第1个JavaBean:Monster的 对象并给该的对象属性赋值放入到容器中, 输出该对象信息 也就是不使用 Spring 的原生框架我们自己简单模拟实现
需求分析 代码实现
1、导入 Dom4j.jar 包
2、编写ZanApplicationContext
public class ZanApplicationContext {private ConcurrentHashMapString, Object singletonObjects new ConcurrentHashMap();// 构造器// 接受一个容器的配置文件比如 beans.xmlpublic ZanApplicationContext(String iocBeanXmlPath) throws Exception {// 1. 得到类加载路径String path this.getClass().getResource(/).getPath();// 2. 创建SAXReaderSAXReader saxReader new SAXReader();// 3. 获取文档Document对象Document document saxReader.read(new File(path iocBeanXmlPath));// 4. 得到rootDocumentElement rootElement document.getRootElement();// 5. 得到第一个bean对象 monster01Element bean (Element) rootElement.elements(bean).get(0);// 6. 获取到第一个 bean-monster01 的相关属性String id bean.attributeValue(id);String classFullPath bean.attributeValue(class);ListElement property bean.elements(property);// 遍历
// for (Element element : property) {
// String value element.attributeValue(value);
// System.out.println(value);
// }// 这里简便获取Integer monsterId Integer.parseInt(property.get(0).attributeValue(value));String name property.get(1).attributeValue(value);String skill property.get(2).attributeValue(value);// 7. 使用反射创建对象 回顾反射机制Class? aClass Class.forName(classFullPath); // 获取对应的class对象// 这是的o对象就是一个Monster对象Monster o (Monster) aClass.newInstance();// 给o对象赋值// 使用反射赋值
// Method[] declaredMethods aClass.getDeclaredMethods();
// for (Method declaredMethod : declaredMethods) {
// Object invoke declaredMethod.invoke(o);
//
// }o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);// 8. 将创建好的对象放入到singleObjects中singletonObjects.put(id, o);}public Object getBean(String id) {// 还可以严谨一下return singletonObjects.get(id);}
}Test类
public class ZanApplicationContextTest {public static void main(String[] args) throws Exception {ZanApplicationContext zanApplicationContext new ZanApplicationContext(beans.xml);Monster monster01 (Monster) zanApplicationContext.getBean(monster01);System.out.println(monster01);}
}Spring原生容器底层结构 补充可以不进行分配ID系统会默认分配ID分配ID的规则为全类名#1全类名#1 …