spring基本使用
1.创建一个dao接口,实现类;service接口,实现类并且service里用new创建对象方式调用dao的方法


2.使用spring分别获取dao和service对象(IOC)




注意

2中的service里面获取dao的对象方式不用new的(DI)


运行测试:
使用1的方式创建service的对象,调用service方法,看是否成功调到了dao的方法

补充知识点
对象起别名:

多个别名之间可以用,;空格分隔


如果上面这里写个不存在的,会报错:

bean的作用范围
就是造的对象是单个还是多个(单例还是非单例的):
如下图:
得到结论,spring默认创建的是单例的。

通过配置的方式创造非单例的:
不配和配上singleton都是单例

加个如下图,再运行上面的程序,发现地址不一样了。

总结:
可以重复用的对象适合用spring创建。

三种方式创建对象,分别如何整合spring
接口和实现类用于代码演示:


日常用new通过构造方法的方式(常用)
就上面的内容。
补充:
spring是用无参构造方法,使用反射创建对象的。
后面看spring原理底层实现再说。
使用静态工厂的方式(了解)
使用静态工厂创建对象
早些年: 创建对象常用的方式,造对象不要自己new,用工厂方式进行一定程度的解耦。
为了兼容早期的一些系统,了解即可。
步骤:
写一个类叫工厂,里面写个静态的(static)方法,用new创建对象返回。

使用工厂获取对象:

如何交给spring管理(了解)
告诉:
工厂类是哪个,
工厂类里面造对象的方法是哪个

使用:

使用非静态工厂方式
早些年还有一些非静态的方式…
使用非静态工厂创建对象(了解)
工厂类:
里面写非静态的方法,返回对象

使用:
就得多个new:

如何交给spring管理(了解)
先要给工厂对象造出来,
然后要告诉用哪个工厂造对象,还要告诉里面哪个方法造对象

实现:

FactoryBean(!!务必掌握,后面整合的时候大量的框架里都在用这种方式和spring打交道)
非静态工厂用spring管理的现有缺陷:

spring专门针对这第三种方式的缺陷做了改良,并且这种改良方式后面还很实用:
要写一个类:
代替原始实例工厂中创建对象的方法

配置:

实现:

造出来的对象userDao是单例还是非单例的
验证一下:
是单例的

改成非单例:

bean的生命周期
依赖注入(往别人里面传对象,上面都是自己去调用别的获取对象)
以后set方法注入起了个名字,要说:setter注入

下面的演示统一用的,运行方法:

setter注入——引用类型
上面讲过了。
提供一个set方法,用ref属性引用对应的bean就行了。

setter注入——简单类型

演示:
提供set方法:

配置文件:

运行结果:

构造器注入
引用类型
set方法改成构造方法:
配置文件:

简单类型


构造器注入(解耦方式写法)
上面基本写法有些缺陷,形参变化了,配置文件里就不能用,名称耦合度高

解耦方式:用参数类型去确定


新问题:如果类型有重复的怎么办

用位置写,告诉他是第几个位置的


总结



四种方式如何选择

依赖自动装配
要是可以不写,spring自己帮你做依赖注入多好——可以
spring自动给你在容器中找到你要的东西再给你塞进去
贯彻落实了ioc的思想:你给个入口,什么都不管,我给你


service里还是这些,不删:

default:默认,no不用


按类型(以后主要使用这个,按名称的话改个名就完了)

其余都不动:


运行结果:能用

注意1:
按类型装配,这里要的是dao,

这里定义的bean实现了dao接口,所以没报错。
如果这里没有,他装配谁啊,所以会报错。

注意2
现在有两个dao的实现类对象,按类型装配,不知道给哪一个。
所以:
按类型装配要求你类型匹配时候,必须是唯一的。

注意3:按类型连名都能不起

按名称
按名称匹配,要保证下面这两个名称要起的一样。不然会报错。


如果有多个,但是名称一个都配不上,还是会报错

总结和注意

集合注入
上面基本注入的都是单一的东西。现在注入多个,集合怎么注入。
这里主要就学个格式。

预置场景
一个dao接口和实现类

配置:配一个dao

运行:

dao实现类:


配置文件写法


**
运行及结果:

总结





数据源对象管理
上面都是管理我们自己的对象。
如果是第三方的对象该怎么管。
这里通过一个案例去看第三方的对象怎么管。这里只选择了一个对象,很多对象的管理都很相似。
前面学过什么就可以管什么。
这里管理一下阿里的德鲁伊。

写配置文件:
分析
想想这个DruidDataSource对象最基本的需要哪些信息:
一个数据源,要连数据库,像数据库驱动,url,用户名密码这些
那我们是用构造方法还是set方法注入?
没得选,因为别人写好的类,点进去看看:
构造方法显然不满足:

set方法:都有,所以使用set方式注入

所以配置文件写法:

运行及结果:

c3p0
添加坐标



要把驱动坐标配上,下面配置文件里属性要驱动

配置文件
管理c3p0连接池对象
查看类发现同样没法使用构造器注入,也得使用set注入

运行

配的信息已经注入进去了:

发现还有很多别的信息:

那就可以继续配:

加载properties文件
上面配置文件中的配置写配置文件中不合理。
要抽出来。

这里要学习如何用spring加载properties文件里的信息
想想有哪些过程:
首先spring要加载properties文件,得告诉spring这个文件,不然读不到里面信息。
第二,写properties文件里,配置文件里就要用别的方式写了。
修改配置文件
开了一个新的namespace命名空间叫做context,这是spring提供的命名空间:
达到一个效果,spring中可以使用一个全新的命名空间叫做context。
以后开命名空间基本都是这个套路,复制新加后改这几个地方:

然后:

演示
上面的看不到效果,弄个能看到效果的证明一下没问题:
写个dao,实现类里定义一个属性name, 把文件读出来的值注入到这里面,运行save方法能看到这个值:


运行程序:


总结

一些坑要注意


容器
对前面的内容进行一个补充




核心容器总结



2万+

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



