IoC(Inversion of Control 控制反转)的DI(dependence Injection 依赖注入)
DI是IoC是一种实现方式。
IoC的实现有两种:
DI:dependence Injection 依赖注入:Spring中使用的这种
对象和对象的属性都是以注入的方式(配置一个bean就是注入一个bean)添加到容器中的。
DL:dependence Lookup 依赖查找:类似于目录的查找方法
设值注入:
注入了对象,但是没有属性。
属性这样也有了,但是没有域属性。
注入
这样就有域对象的属性了。
以后遇到对象 有域属性的时候,通过ref 引入域对象(前提是已经引入了这个对象)。
前提是这个对象 和它的域对象都要有 无参构造&set方法。
get方法 和有参构造 可有可无。
构造注入:
底层采用带参数的构造器(可以不写无参构造和set方法),但是一般不用这个
传入的时候index属性和 前面的实体类的属性(默认参数)一一对应的话可以不写下标。
还可以使用name属性指定参数的名称(很少用)
注入各种类型(数组、 list set map properties的值
字符串数组:
vlaue 是基本数据类型 和字符串数组用的,所以这里不要再用value了。而是使用ref
对象数组(自定义类型数组 统统使用ref):
字符串list
对象list
字符串set
字符串map
entryset:键值对集合,所以map里面使用entry
对象map
properties(属性)
域对象自动注入:autowire
可以使用autowire自动注入域属性。
按名称中注入:byName 会搜索配置文件中 和对象属性名相同ID的bean,自动注入。
按类型自动注入:byType 查找和域属性类型相同或者其子类的bean的对象,注入。
1.id不相同无所谓。根本不看id,没有id也可以。
2. 只要属性里面有个type为school的(有且仅有一个),同一个类型的对象,有多个bean,就要错。
3. 如果当前类和他的子类对象都在这个配置文件里,那就会错。
如下,当有两个school的时候就不行了。这个时候只能按名称了。
当遇到多个配置文件
1.使用可变参数
2.使用通配符
3.设置一个总配置文件
注意,总配置文件和次配置文件 的文件名字格式不能一样,比如下面 不能都写成 “spring-” 类型。
DI注解:dependence Injection 依赖注入
IoC的DI注解底层使用了AOP,要添加AOP的jar包。
有了注解,配置文件里面配置的bean就不需要了。
加context约束头
添加组件(component ) 扫描器 component :告诉spring框架 去源代码里面指定的某些包下面去找这个注解。
注意,带星 * 的扫的都是这个包的 子包。当前包下的配置文件扫不到。
涉及到自动注入,就要加Autowired。
若后面有Qualifier 就是按名字注入,没有就是按类型(默认的)
自动注入另外的写法:Resource 按类型 / Resource(name=" ") 按名称
这个注解是加载源代码级别的。
使用一个配置类来替换配置文件。
SpringBoot推荐使用
@Configuration
通过@Bean 表示当前返回值的对象就是一个bean
同样的 bean后面可以配置很多东西
有了这个方法,在创建实体类的时候就不用加注解了。
注解和配置的优缺点“:
注解:简单,写在源码中,修改了注解的属性,代码必须重新编译。
配置文件:修改配置文件,重启服务器,配置生效。
注意,配置文件和注解同时存在的时候,配置的优先级要高于注解。
JDBCTemple
Spring中内置的JDBC的封装,类似于dbutils
导入jar包:
基本jar包 7个,mysqljdbc驱动 spring-jdbc.jar ,spring-tx.jar 一共9个包
以后在业务层的实现类,就不再new ServiceImpl了
而是使用注入
在这里必须要提供set方法
在写配置文件的时候 ctrl+shift+T 查找文件,找到这个来自spring框架的jdbc数据源
双击进入,拷贝全路径名。供class使用。
org.springframework.jdbc.datasource.DriverManagerDataSource
JDBC的配置参数,由于需要找到spring框架里面赋予的名字,需要进行如下操作。
在这个DriverManagerDataSource里面找配置方法。选中方法名 ctrl+O
这样就获得了driverManagerDataSource的第一个配置参数 driverClassName
由于需要四个配置文件,而driverManagerDataSource只有一个,故此时进入driverManagerDataSource 的父类去寻找。点击进入父类。寻找其他配置参数的名称。
这样就得到了四大配置文件的名字及其值
填入老四样的具体路径
写好配置文件了,现在来指定配置文件的路径名。
同样的 ctrl+shift+T 这里不要导错包了,有两个来自其他jar包的
拷贝全路径名。这里再写的时候没有配置脚本文档,可以通过名字自行导入
进入PropertyPlaceholderConfigurer,寻找配置文件名ctrl+o
发现没有合适的jar包,进入父类寻找
仍然没有,进入父类的父类寻找
发现还是没有。继续进入父类
这里需要导入包
还是没有。继续进入父类。
终于找到了。
拷贝方法名
就这样,指定了配置文件的路径。
**==========================================================================================================**
指定路径名的第二种方法:通过DI注解:
先修改头文件:加入三句di注解的头文件配置
第一次使用右括号 < 的时候没有出现context的选项,检查jar包存在,并且buildPath了,
故重启eclipse,终于正常。
原因:少导入了个包
要一致。然后发现还是不行 junit没有报错,但是没有插入数据。
经过检查发现居然是业务层实现类忘了写方法 了!
通过修改过后,正常插入。实现功能。
**=========================================================================================================**
完整代码:
实体类:
持久层接口:
持久层实现类
业务层接口
业务层实现类:
包:
**=======================================================================================================**
另一种配置DataSource的方法
进如JdbcDaoSupport
进入这个方法,拷贝全路径名。
在这个方法内查找set属性方法,无果,进入父类方法查找
有了。
配置完成。
**==========================================================================================================**
DBCP连接池
在此路径下找到这两个包 并部署到项目中。
找到这个包并部署到项目里 。
配置数据源,使用dbcp连接源
找到这个方法,进入
直接复制包名
现在需要去这个包里面找配置的名字了。
添加说明文档
在方法里面通过搜索setdriver seturl setusername setpass 发现和jdbc的属性名一样,所以不需要修改。
这样就配置成功了。
通过测试成功,这时候DBCP就配置成功了。
=============================================================================================================
C3P0连接池
在这个路径里面吧jar包部署到程序中
现在随便找一个使用过c3p0的项目 获得c3p0的关键字
ctrl+shift+t
这些配置文件,同样可以使用jar的source文件来寻找
这样,c3p0就配置完成了。
接下来测试一下其他方法的使用。
查找
测试的时候出错
发现是集合的返回类型写错了,应该是String类。
自己写的另外的方法,一直测试跑不通(上图注释掉的),
网上搜索是没有rowMap
创建rowMapper
重新写这两个方法的实现类。
针对查询结果返回一个list的: query
测试 ,成功。