spring :创建对象和管理对象的框架
Spring AOP SpringIOC Spring DI具体实现在另一篇,下面讲解的是依赖注入和控制反转的实现。
演示!!
SpringBeanFactory代表spring 对象工厂、
SpringRunner代表调用对象!
项目创建——————————
version 这个工程的版本号,自己定义,表示自己的项目的版本。
https://mvnrepository.com/ 下载依赖 自选版本。
点击数字进入,我这里选5.3.14,找到以下代码
添加到项目的pom.xml文件中 dependencies中
右上角m 刷新
项目会根据xml的标签解析下载以下文件。
将类作为工厂————
1、创建对象
操作步骤:
-
创建类(应该在包下 一般为 java包下:公司名.项目名.类名 例如huawei.spring.SpringFramework)
- @Bean的作用 让spring调用此方法,创建对象并管理返回的内容。 后面的getBean可获取方法的内容。
-
测试类
顺序如下:
将包作为工厂————
以下代码会使Spring框架 ——加载下面构造函数参数:此包和子孙包里面的类。根据需求写的精不精确。
但不是直接加载里面所有spring工厂(这里指下面构造函数传入的包名)的对象,只有加了
@Component
这个注解才会被加载进这个工厂(cn.tedu.spring为工厂)。 UserMapper为工厂对象
AnnotationConfigApplicationContext ac
= new AnnotationConfigApplicationContext("cn.tedu.spring");
组件:被以下注解的
可以在注解上写参数 表名对象的名字不用默认的名字。
改写后就只能用这个名字
构造函数和描述 |
---|
AnnotationConfigApplicationContext()
创建一个新的 AnnotationConfigApplicationContext 需要通过register(java.lang.Class<?>...)调用填充然后手动刷新。
|
AnnotationConfigApplicationContext(Class<?>... componentClasses)
创建一个新的 AnnotationConfigApplicationContext,从给定的组件类派生 bean 定义并自动刷新上下文。
|
AnnotationConfigApplicationContext(DefaultListableBeanFactory beanFactory)
使用给定的 DefaultListableBeanFactory 创建一个新的 AnnotationConfigApplicationContext。
|
AnnotationConfigApplicationContext(String... basePackages)
创建一个新的 AnnotationConfigApplicationContext,扫描给定包中的组件,为这些组件注册 bean 定义,
并自动刷新上下文。
|
获取对象时 要将类名第一个小写,后面的大小写.(类名写错了前两个字母大写的情况下,后面写错第二种或者rename)
UserMapper userMapper = ac.getBean("userMapper", UserMapper.class);
USerMapper userMapper = ac.getBean("uSerMapper", UserMapper.class);
@ComponentScan 注解里面有多个属性, 以下传入的是value值 是一个数组,为了可以在加载被标记的类时执行多个包的扫描。
@ComponentScan({"cn.tedu.spring","java"}) //加载两个根包(也就是两个工厂)的对象
总结
总结:
使用@Bean时将类作为工厂。适用所有场景。(扫描类,@Bean标记方法返回值为对象) 使用繁琐每次都得加方法和注解。
使用组件扫描时:只适用于在自定义场景。(自己创建的类)
使用以下时就可以 ,只需要创建包下创建类加那四个注解就行了。
@Configuration //标记为组件,可被spring加载
@ComponentScan({"cn.tedu.spring","java"}) //加载此类的同时扫描这个包及以下
public class SpringConfig {
}
Spring管理对象的作用域与生命周期。
作用域
springSpring管理的对象作用域默认是单例的(并不是单例模式),对于得到的同一个Bean,获取多少次都是同一对象。
单例的,创建的对象都是同一个。
(@Scope(“singleton”)单例 默认、@Scope(“prototype”)非单例)
单例情况下才考虑懒加载——————
懒加载模式: 用的时候创建。 要创建的对象时加@Lazy 优点:节约内存 缺点:当服务器正忙时,可能急用的时候1等待时间长
默认饿加载:一次性加载完 优点:启动时候费时间 缺点:非内存
生命周期:
由Spring创建并管理的对象,则开发人员就没有了对对象的控制权,无法对对象进行干预。
而Spring允许在类中自定义最多两个方法(重写构造方法时构造方法不算自定义方法),分别表示初始化和销毁的方法,并且,Spring在创建对象之后执行初始化方法,销毁对象(关闭加载spring
的通道)之前执行销毁方法。{无论写不写ac.close 方法 都会执行销毁方法。}
关于两个方法:可以按需添加,例如,当你只需要干预销毁过程时,可只定义初始化方法。
@PostConstruct注解表示标记的方法为初始化方法
@PreDestroy 标记的方法为销毁方法。
注意点:只有当值单例的时候才能管理生命周期。
自动装配:
在A对象的方法中使用spring容器中的B对象,A对象上将B对象作为属性,.加注解@Autowired
spring就会在容器里面去找合适的值,将值赋值给对象。
关于自动装配:
A对象在容器中数量为0时
如果UserMapper没被组件注解标记,则不存在容器中。
@Autowired(required = true)默认的为true不加也可
则在容器的B对象调用时A对象时,就会在初始化加载spring时报错。
A对象在容器中数量为1时
UserMapper被组件注解标记l,则存在容器中。
@Autowired(required = false)
则在容器的B对象调用时A对象时,就会在初始化加载spring时不报错,但是注解表示了放弃了自动转配。spring就不会去拿这个B对象给A用,B中UserMapper的值就为null,使用时出现空指针异常。
多个:自动尝试按照名称实现装配(属性的名称与Spring Bean的名称)
存在与属性名称匹配的Spring Bean:装配成功
不存在与属性名称匹配的Spring Bean:装配失败,启动项目时即报告异常
另外,使用@Resource
注解也可以实现自动装配(此注解是javax
包中的),其装配机制是先尝试根据名称来装配,如果失败,再尝试根据类型装配!
使用构造方法传值时,可不用自动转配(@autowired)。 加载了容器时,UserController对象的UserMappr属性的值就有了。(有无参构造方法时,UserMapppr属性的值就为null)
Spring 读取properties的内容
设置配置文件
读取
/*上方还会读取jdk的、操作系统的配置文件 所以配置文件和他们有同名时会使用的他们的,不会使用自己定义的,需要自己改名字*/
可以实现类型转换,只要java正常可转的类型。 配置文件是字符串,读取完可以转为基本数据类型(其他类型也可)
通过Environment(保存Spring读取到的对象的环境)获取配置文件
——————————————————————————————————————————————————————————————————————————————————————————
关于spring框架的小结
关于Spring你应该了解
作用:创建对象、管理对象。
创建对象的方法:掌握通过Spring创建对象的2种方式
- 在配置类(带@Configuration的类)(只为了加载Spring,)使用@Bean注解标记
- 使用组件扫描: @Component @Controller @Service @Repository
- 如果是自定义的类,应该使用组件扫描+组件注解的方法。不是自定义的类,用@Bean方法
了解Spring Bean的生命周期及作用域
掌握@Autowired 自动装配,理解自动装配机制
了解并背下来 @Autowired注解和、@ Resource区别
掌握读取配置文件.properties的方法
1、使用@PropertySource注解表名读取的配置文件是哪个,使用Value给类的属性赋值
2、使用Environment环境对象,从此对象中得到配置文件的值。
Spring的IOC(Inverion of Controller )控制翻转 DI(Dependency Inject) 依赖注入
- Spring框架基于DI实现了IoC,DI是一种实现手段,IoC是最终实现的目标/效果
- Spring AOP SpringIOC Spring DI具体等待下次分解