ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
,ApplicationContext接口,它由BeanFactory接口派生而来,因而提供了BeanFactory所有的功能。配置文件中的bean的信息是被加载在HashMap中的,一个bean通常包括,id,class,property等,bean的id对应HashMap中的key,value呢就是bean具体如何加载?源码如下:
if (beanProperty.element("map") != null){
Map<String, Object> propertiesMap = new HashMap<String, Object>();
Element propertiesListMap = (Element)beanProperty.elements().get(0);
Iterator<?> propertiesIterator = propertiesListMap .elements().iterator();
while (propertiesIterator.hasNext()) {
Element vet = (Element) propertiesIterator.next();
if(vet.getName().equals("entry")) {
String key = vet.attributeValue("key");
Iterator<?> valuesIterator = vet.elements() .iterator();
while (valuesIterator.hasNext()) {
Element value = (Element) valuesIterator.next();
if (value.getName().equals("value")){
propertiesMap.put(key, value.getText());
}
if (value.getName().equals("ref")) {
propertiesMap.put(key, new String[]{
value.attributeValue("bean")
});
}
}
}
}
bean.getProperties().put(name, propertiesMap);
//看完反正我是默默放弃了。。。
}
SpringService springService =(SpringService)ac.getBean("Service");
具体如下:
Java反射博大精深,我也不很懂,具体请查看Java基础之—反射
那么bean中的东西到底是怎么注入进去的?简单来讲,就是在实例化一个bean时,实际上就实例化了类,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。这样就回到了我们Java最原始的地方,对象.方法,对象.属性
什么是spring?
spring是一个容器框架,它可以接管web层,业务层,dao层,持久层的各个组件,并且可以配置各种bean, 并可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以直接getBean(id),使用即可
Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象) ,Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
IOC
DI
AOP
2019-09-03 补充 :
内容取自《spring源码解析》
spring整体架构图:
1、core container(核心容器)
核心容器包含了core,beans,context和expression language四个模块
core和beans模块是框架的基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
core模块主要包含了spring框架基本的黑犀牛工具类,spring的其他组建都要用到这个包里的类,core模块是其他组件的基本核心。当然你也可以在自己应用系统中使用这些工具类。
beans模块是所有应用都要用到的,它包含访问配置文件,创建和管理bean以及进行ioc,di操作相关的所有类
context模块构建与core和beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。context模块继承了beans的特性,为spring核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对context的透明创建的支持。context模块同事也支持j2ee的一些特性,例如EJB,JMX和基础的远程处理,applicationContext接口是context模块的关键。
ExpressionLanguage模块提供了强大的表达式语言,用于在运行时查询和操纵对象。他是jsp2.1规范中定义的unifed expression language的扩展。该语言支持设置/获取属性的值,属性的分配,方法的调用 ,访问数组上下文,容器和索引器,逻辑和算数运算符,命名变量以及从spring的ioc容器中根据名称检索对象。它也支持list投影,选择和一般的list聚合
2、Date Access/Integration
Date Access/Integration层包含JDBC,ORM,OXM,JMS和Transaction模块
jdbc模块提供了一个jdbc抽象层,他可以消除冗长的jdbc编码和解析数据厂商特有的错误代码。这个模块包含了spring对jdbc数据访问进行封装的所有类。
orm模块为流行的对象-关系映射API,如JPA,JDO,Hibernate,iBatis等,提供了一个交互层。利用ORM封装包,可以混合使用所有spring提供的特性进行O/R映射,如前边提到的简单声明性事务管理。spring框架插入了若干个ORM框架 ,从而提供了ORM的对象关系工具,其中包括JDO,hibernate和iBatisSQl Map。所有这些都遵从spring的通用事务和DAO异常层次结构。
OXM模块提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB,Castor,XMLBeans,JiBX和XStream。
JMS(java massage service)模块主要包含了一些制造和消费消息的特性
Transaction模块支持编程和声明性的事务管理,这些事务类必须实现特地的接口。并且对多有的POJO都适用
3、web
web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以,spring框架支持与Jakarta struts的集成。web模块还简化了处理大部分请求以及将请求参数绑定到域对象的工作。web层包含了web,web-servlet,web-Struts 和web-porlet
4、AOP
aop模块提供了一个符合aop联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点像.Net技术中的attribute概念
通过配置管理特性,springAop模块直接将面向界面的编程功能集成到了spring框架中,所以可以很容易地使用spring框架管理的任何对象支持aop,springAop模块为基于spring的应用程序中的对象提供了事务管理服务。通过使用springAop,不用历来EJB组件,就可以将声明性事务管理集成到应用程序中。
5、Test
test模块支持使用JUnit和TestNG对spring组件进行测试。
1、什么是SpringMVC?
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
mvc
struts2与springMVC的区别?
1、Struts2是类级别的拦截,一个类对应一个request 上下文, SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url ,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、由上边原因, SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码读程序时带来麻烦,每次来了请求就创建一个Action ,一个Action对象对应一个request 上下文。
3、由于Struts2需要针对每个request进行封装,把request , session等servlet生命周期的变量封装成一个一 个Map ,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
4、拦截器实现机制上, Struts2有以自己的interceptor机制, SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
5、SpringMVC的入口是servlet ,而Struts2是filter (这里要指出, filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致 了二者的机制不同,这里就牵涉到servlet和filter的区别了。
6、SpringMVC集成了Ajax ,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax ,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
7、SpringMVC验证支持JSR303 ,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。
8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC-样的效果,但是需要xml配置的地方不少)。
9、设计思想上, Struts2更加符合0OP的编程思想,SpringMVC就比较谨慎,在servlet上扩展。
10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经100%零配置。
第一步:配置文件mybatis.xml,大体如下,
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false" />
<setting name="cacheEnabled" value="true"/>
settings>
<typeAliases>
<package name="com.nuc.entity">package>
typeAliases>
<environments default="environments">
<environment id="environments">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
<mappers>
<package name="com.nuc.mapper" />
mappers>
configuration>
第二步:加载我们的xml文件
第三步:创建SqlSessionFactoryBuilder
第四步:创建SqlSessionFactory
第五步:调用openSession(),开启sqlSession
第六步:getMapper()来获取我们的mapper(接口),mapper对应的映射文件,在加载mybatis.xml时就会加载
第七步:使用我们自己的mapper和它对应的xml来完成我们和数据库交互。即增删改查。
第八步:提交session,关闭session。
代码如下:
String resource = "mybatis-config.xml";
SqlSession sqlSession = null;
InputStream inputStream = Resources.getResourceAsStream(resource);//读取mybatis配置文件
//SqlSessionFactoryBuilder这个类的作用就是为了创建SqlSessionFactory的
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
/**
* factory.openSession(); //需手动提交事务
* factory.openSession(true); //系统自动提交事务
*/
sqlSession = factory.openSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
//增删改查的操作
sqlSession.commit();//如果没有提交,数据库的数据不会改变
sqlSession.close();
需要注意的是,sqlSession也自带一些数据交互的操作
什么是Mybatis?
mybatis底层实现
对原生态jdbc程序(单独使用jdbc开发)问题总结:
解决:使用数据库连接池管理数据库连接
解决:将sql语句设置在xml配置文件中,即使sql变化,也无需重新编译
解决:将sql语句及占位符,参数全部配置在xml文件中
解决:将查询的结果集,自动映射成java对象
mybatis工作原理
Mybatis输入映射
Mybatis输出映射
一、resultType
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,则不会创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
二、resultMap
Mybatis的动态sql
什么是动态sql?
数据模型分析思路
3、数据库级别表与表之间的关系
4、表与表之间的业务关系