您现在的位置是:首页 >技术教程 >Spring的创建和使用,存储和读取Bean总结网站首页技术教程
Spring的创建和使用,存储和读取Bean总结
目录
ApplicationContext和BeanFactory的区别
Spring项目创建和使用流程
1.创建一个 Spring 项目
1.1.创建一个 maven 项目
1.2.添加 spring-context 依赖
1.3.在resources目录中创建一个 spring-config.xml 的配置文件
1.4.创建一个启动类(为后面从 spring 容器中获取 bean 做准备)
2.存储 Bean
2.1先创建 Bean 对象
2.2配置文件的方式<bean></bean>
a.通过 spring 配置文件(spring-config.xml)<bean id = "bean名称" class = "包名+类名"></bean>
2.3通过注解的方式
a.配置扫描路径,只有扫描路径下的包才有可能将Bean存储到 Spring 容器中
b.在扫描路径的类中加五大类注解 或@Bean 方法注解
3.读取 Bean
在启动类中读取Bean(含有main方法)
3.1.得到 Spring 对象(通过ApplicationContext或者BeanFactory接口 创建一个 ClassPathXmlApplicationContext/ClassPathResouece对象,把配置文件名(spring-config.xml)通过字符串的方式传入到这个对象中
3.2配置文件的方式:通过 Spring 对象 getBean方法传入在配置文件设置的id和类名 获取到 Bean 对象(DI)
3.3:五大类注解的方式:通过Spring对象,getBean方法传入类名的小驼峰形式(如果类名的第一个字母和第二个字母都是大小,此时类名保持不变,不必写成小驼峰形式)和类名
3.4:@Bean的方式:通过 Spring 对象 getBean方法传入该@Bean存储对象的名称(方法名),和该方发返回值的类型在普通类中读取:属性注入,方法注入,构造方法注入
ApplicationContext和BeanFactory的区别
ApplicationContext是BeanFactory的子类,除了继承BeanFactory的所有功能外,还拥有自己的特性
AplicationContext会将 spring-config.xml中所有的对象存储到 spring容器 中.比较费内存,一次性加载,之后的读取会非常快
BeanFactory,类似于懒加载,只有调用 getBean 才会加载对应的 Bean.比较节省内存,调用时才会加载初始化 bean 到 spring容器 中,效率不高
通过注解存储 Bean对象
1.使用五大类注解
2.使用方法注解@Bean
@Controller
控制器,直接和用户打交道,验证用户请求数据的正确性
@Service
服务:编排和调度具体执行方法
@Respository
持久层:和数据库交互
@Component
组件:工具类
@Configurartion
配置项:项目中的一些配置
使用注解存储 Bean 对象
1.在配置文件spring-config.xml中,配置存储对象所在包的路径,只有被配置的包下的所有类,添加了注解才能被识别保存到 Spring 容器中
使用注解获取 Bean 对象
同样需要得到一个Spring对象(ApplicationContext或者BeanFactory),通过Spring对象,getBean方法传入类名的小驼峰形式(如果类名的第一个字母和第二个字母都是大小,此时类名保持不变,不必写成小驼峰形式)和类名
五大类注解的关系
Java程序标准分层
五大类注解在都是基于Component实现的,继承于Component,它们在功能上没有多大区别,五大类注解是根据上述分层需求来划分的,使用五大类注解的目的是为了让程序员看到注解后,直接看出当前类的用途.
方法注解@Bean
类注解是添加到某个类上,而方法注解是放到某个方法上的
@Bean 的命名规则默认情况下是 @Bean 存储对象的名称 = 方法名
@Bean 注解必须配合五大类注解一起使用
重命名:@Bean(name/value = "重命名"),重命名后,默认的使用方法名获取存储对象名称的方法就不行了
如果是Bean注解 ,想要获取到Bean 就需要通过 Spring 对象 getBean方法传入该@Bean存储对象的名称,和该方发返回值的类型
注入Bean对象的三种方式
1.属性注入
使用Autowired注解
@Autowired
private User user;
优点:简单
缺点:1.没办法实现 final 修饰的变量注入(final修饰的对象,要么直接赋值,要么在构造方法中赋值)
2.只适用于IoC容器,兼容性低 3.因为写法简单,违背单一设计原则的概率更大
2.Setter注入
private User user;
@Autowired
public void User(User user){
this.user = user;
}
优点:符合单一设计原则
缺点:1.不能注入 final 修饰的对象(final修饰的对象,要么直接赋值,要么在构造方法中赋值)
2.注入的对象可被修改
3.构造方法注入
private User user;
@Autowired
public Test(User user){
this.user = user;
}
优点:
1.可以注入一个不可变的对象(final修饰的对象,要么直接赋值,要么在构造方法中赋值.)
2.注入的对象不会改变(构造方法只能执行一次)
3.构造方法注入可以保证注入对象完全被初始化
4.构造方法的兼容性更好(构造方法注入可以脱离IoC容器)
Autowried 和 Resource
Autowried来自于Spring. Resource来自于JDK
Resource注解不能构造方法注入
Resource支持更多的参数设置
Autiwried先根据类型查找,之后再根据名称查找.Resource先根据名称查找,再根据类型查找