前言
多年积累的模型mvc:model、view、controller
ssh:spring、strus2、hibernate(orm对象关系映射)
ssm:spring、springmvc、mybatis
牛人:rod johson
正文
Spring主要作用:
整合现在主流框架。使框架之间的调用更加的顺畅、快捷、方便管理
文章目录:
1.Spring的IOC(控制反转)和DI(依赖注入)
2.统统使用注解形式简化配置
3. AOP面向切面编程
4.AOP的练习
5.spring和JDBC的整合 Spring的声明式的事务处理
一、Spring的IOC:控制反转
定义:把对象的创建初始化和销毁的工作都交给spring容器来做。从此程序员无需关注对象的创建过程。
1.Person p1 = new Person();//主动创建
2.Person p2 = Spring容器.get**(); //对象创建的权利交给spring容器
二、问题
1.为什么要用这种方式创建对象
2.这样写的好处
三、IOC的实现步骤:
1.导入相关jar包
2.创建实体类
3.编写配置文件xml(1.配置文件的头 2.配置实体类对应关系)
4.启动spring容器
5.得到相应的对象 对象调用方法完成相应的功能。
四、具体的实现:
1.导包
2.创建实体类
public class Hello {
//第二步 创建实体类
public void say(){
System.out.println("Hello Spring ");
}
}
3.配置xml文件(在src目录下)
(1)配置文件的默认的名称就是 applicationContext.xml
(2)配置文件的名称任意,但是一般都写默认的
其余的程序员一看就知道是spring的配置文件
(3)配置文件的头
1>直接粘贴 有模板
2>通过手动生成见《手动生成配置文件的头》
(4)配置实体类的对应关系<?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-3.2.xsd">
<!--只要spring容器管理对象就是一个bean
id:唯一标识 首字母小写的类名 后边驼峰规则
class:包名+类名
-->
<bean id="hello" class="domain.Hello"></bean>
</beans>
其中class中要写的对应的类的包名加类名不要手动写,可以写类的前几个字母然后alt+/可以选你写的类然后可以自动补全类名加包名了
4.启动spring容器
//第四步:启动spring的容器
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
以上代码是面向接口的编程方式:前面是接口后面new的是实现类
5.获取对象
//第五步 获取相应的对象
Hello hello = (Hello) context.getBean("hello");
hello.say();
五、IOC的实现过程
当容器启动的时候首先会先加载applicationContext.xml,顺序加载当遇到Bean标签的时候根据class的路径找到相应的实体类并且创建对象,把创建出来的对象放到spring容器里。(内存中维护了一张map表)spring容器内部维护了一张MAP<key,value> 对象的ID就是MAP中的Key 、对象就是value保存在spring器中。如果想获得相应的对象 则通过getBean("ID")就能得到应用的对象
六、常见的问题:

(2)代码中bean的ID编写错误

七、关于bean的问题
配置:
使用:
报错:
建议使用id,因为使用class可能会造成1对二的情况,如下报错

发生场景:
一个项目有多人开发,当多个人想要使用Hello这个类时,每个人都在配置文件中编写一个对应关系(id是各自定义的,class都是Hello类),在使用类来获取对象时就会发生以上报错
八、别名标签
<!--别名标签 -->
<aliasname="hello" alias="1606"/>
使用场景,需要一个class对应多个id时使用,比方说在一个项目中每个项目部门规定了自己本部门的对一个类的命名id,这时可以使用别名标签。
可以避免6(使用class找时)一对二的问题
九、Spring对象创建的原理
//domain.Hello
Class.forName(Hello.class.getName()).newInstance();
十、无参构造的重要性
我们spring底层通过反射调用的形式创建对象,所以实体类中必须要有无参构造。以后在手动编写构造方法的时候一定切记要加无参构造
十一、spring容器创建对象的四种方式
1.通过默认的构造方法创建对象
2.通过静态工厂创建对象
<!--静态工厂创建对象 -->
<beanid="calendar" class="factory.StaticFactory" factory-method="getTime"></bean>
具体步骤:
当spring容器启动的时候顺序加载xml配置文件。找到相应的bean 根据class找到静态工厂 再通过factory-method="getTime"中getTime方法创建对象,把对象放到spring容器中。
如果在静态工厂中没有static 就会报如下错
3.实例工厂创建对象
<!--实例工厂创建对象 -->
<beanid="newInstanceFactory" class="factory.NewInstanceFactory"></bean>
<beanid="newCalendar" factory-bean="newInstanceFactory"factory-method="getTime"></bean>
说明:
实例工厂和静态工厂最大的区别在于工厂对象是否被创建
4.spring工厂创建对象
xml配置文件
<!--spring工厂创建对象 -->
<beanid="springCalendar" class="factory.SpringFactory"></bean>
需要实现一个接口 然后自动调用 getObject()
//spring工厂创建对象
public classSpringFactory implements FactoryBean<Calendar>{
@Override
public CalendargetObject() throws Exception {
returnCalendar.getInstance();
}
@Override
publicClass<?> getObjectType() {
// TODO Auto-generatedmethod stub
returnCalendar.class;
}
@Override
public booleanisSingleton() {
// TODOAuto-generated method stub
return false;
}
}
十二、Spring容器创建对象是单例还是多例的
当在默认的条件下spring容器创建对象是单例的
好处能够提高计算机的性能,减少内存的压力。
<!--测试spring单例和多例
scope="prototype" 多例对象
默认条件下和 scope="singleton" 都是单例的
-->
<beanid="person" class="domain.Person"scope="singleton"></bean>
spring容器只负责维护单例对象,多例对象spring只负责创建然后自生自灭
十三、自定义的初始化方法(对象创建后被调用)和销毁方法(容器关闭后被调用)
init-method="init"destroy-method="destroy"
容器关闭(把接口ApplicationContext替换为实现类ClassPathXmlApplicationContext后有close方法)
ClassPathXmlApplicationContextcontext =
newClassPathXmlApplicationContext("applicationContext.xml");
Person p1 = (Person)context.getBean("person");
p1.add();
context.close();
十四、对象的懒加载
问题:spring容器启动的时候就会根据bean来创建对象,并且是全部创建,对于这种模式程序性能不能提高
理想模式:当我需要使用某个对象的时候,这个对象才会被创建。如果我不需要的时候,那么这个对象就不会被创建出来。
<!--懒加载的配置
lazy-init="default"
lazy-init="false" 默认的就是立即加载
lazy-init="true" 进行懒加载
-->
<beanid="person" class="domain.Person"lazy-init="true"></bean>
注意:
当<beanid="person" class="domain.Person"lazy-init="false" scope="prototype"></bean>
对象的属性scope为prototype的时候多例对象 立即加载会失效。
会变成懒加载。因为容器不知道使用者到底要创建多少对象。
注意:
lazy-init="default" 这时需要查看default-lazy-init="false"
它的匹配规则和默认的保持一致
当全局的懒加载和bean中的懒加载不一致时,按照bean中的配置执行。
关于多例对象销毁问题
当多例对象时容器只负责创建其他一概不管。
如果不使用懒加载,启动容器后会顺序创建类,如果类有错会发现,如果都改为懒加载,只有在用到这个类时才会报错。所以编写时最好不使用懒加载,可以及时发现问题,将程序调节好后,再将需要使用懒加载的地方改为懒加载。
资源:点击打开链接
本文详细介绍Spring框架的基础概念,包括控制反转(IOC)、依赖注入(DI)等核心特性,并讲解了如何通过XML配置文件管理和创建对象。
3073

被折叠的 条评论
为什么被折叠?



