Java Bean
每一个类实现了Bean的规范才可以由Spring来接管,那么Bean的规范是什么呢?
- 必须是个公有(public)类
- 有无参构造函数
- 用公共方法暴露内部成员属性(getter,setter)
实现这样规范的类,被称为Java Bean。即是一种可重用的组件。
从图中我们可以看出Spring通过反射创建Springone 的对象,注意这里需要进行无参构造,并且测试数据输出了Spring one Runing 也证实了这一猜想,图中的id是Spirngone这个类的唯一标识,也可以叫做它的别名吗,所以既然叫做唯一标识就不允许重复
Bean的作用域
Spring定义了多种Bean作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例。
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
- 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。
详细讲解:
可以发现在测试数据中两个对象的地址是相同的,说明是单例的,而通过debug也可以发现,单例模式在容器创建的时候,也就是ApplicationContext context =new ClassPathXmlApplicationContext(“applicationContext.xml”);这句话运行的时候会创建对象,并且每次获得都是这个对象,而当是多例模式的时候,会发现在容器创建的时候不会创建这个对象,而是会在 Springone springone = (Springone) context.getBean(“springone”);这句话运行的时候才会创建对象,并且地址不同,如下图
此图是单例的例子
此图是多例的
在bean中配置初始化方法和销毁方法
销毁方式是没有来得及打印
创建JavaBean的方法
注:主要是依靠工厂
上面所说的创建对象需要的是无参构造,而下面是利用有参的构造
静态工厂:
如图,我们都知道调用静态方法,只需要拿到类即可,而不需要拿到他的实例化对象,所以此块得到的是他的类对象,所以我们可以理解为在一个bean的标签里面直接写geUsertDao方法,是类对象直接调用静态方法,也就是说这一个标签起到的作用获得工厂的类对象并调用getUserdao方法,返回Userdao实例化对象,就是如下图所示
动态工厂
而工厂去调用非静态的方法创建实例的userDao对象,必须先new一个工厂对象再去调用它的方法,所以这两个标签所起到的作用就是第一个标签先创建工厂的类对象,然后第二个标签
创建工厂的实例对象并调用工厂的getUserdao方法,获得Userdao的对象。如下图
Spring依赖注入
不管是JavaBean还是像我们在原生JavaEE中写的业务层Service都可以把实例化对象这部交给Spring创建,而创建对象过程中,像上面的通过写方法去创建对象,有点麻烦,可以通过Spring的依赖注入进行创建,而创建一个对象的方法无非有两种,一种是Set的方法一种是构造器构造下面先介绍一个set方法构造
set构造
根据如上所说进行优化
通过在UserService中通过Set方法获得Userdao对象,而通过Spring的依赖注入,即依赖注入(property),将UserDao注入到set方法中,而property的name不是service中的属性名,而是set方法后面的英文,并且首字母要小写
还有一种方法就是P命名空间
可以省去写property的步骤,但是感觉作用不大,不详细进行解析和记笔记
通过构造器构造注入
注意:这里面的name和ref意义不同,name是set的属性名,但是ref是spring容器中Bean的id名字。
上面都是对Bean的注入即对象的注入,下面将介绍其实Spring的构造还可以对普通数据构造或者一些复杂的集合,数组构造等等如下图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201103211005366.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzQ1NDUx,size_16,color_FFFFFF,t_70#pic_center)
开发时的建议:
将每个层的xml文件分开写,最后引入到一个总的xml文件中是更好的选择
数据库连接源往往需要代码去设置用户名密码等等,在Spring中通过xml解决了如果后期需要更改数据库还要去更改代码的麻烦。但是需要配置数据源 配置数据源,连接数据库 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201104103136801.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzQ1NDUx,size_16,color_FFFFFF,t_70#pic_center)
用注解进行Spring开发
Controller,Service,Repository这这个注解和Component的作用是一样的,都是实例化Bean,只不过可以给我们一个提示作用,这个Bean处于哪个层
Autowired,Qualifier,Resource,用于注入的,相当于Property里面的ref的,而Value是替代里面的value的
Scope是作用范围
最后两个第一个是初始化方法,第二个是销毁方法
实践:
注意要使用组件扫描:因为Spirng不知道你要到哪去找这个注解,这个组件扫描就是告诉Spring在哪个包下的Bean需要Spring扫描
如果有多个类型的Userdao,那么要用如下图的方法进行注入
还可以只用一注解,如下图
而Value如果只是给类的属性注入值显得苍白无力,实际开发中也不是这样用的,具体用法,如下图
新注解
新注解是为了那些无法进行注解的标签而产生的
通过新注解可以将Java文件作为配置文件,并且一个java文件可以当作主配置文件,还有很多子的java文件。如下图
Spring整合Junit对测试的简化
使用xml作为配置文件则使用如下方式
使用java文件作为配置文件则使用如下配置