实验十二:引用外部属性文件(重要)
注意:需要依赖context名称空间
xmlns:context=“http://www.springframework.org/schema/context”
IDEA中要在xsi中加
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
数据库连接池作为单实例是最好的:
一个项目就一个连接池,连接池里面管理很多连接,连接是直接从连接池中拿
可以让Spring帮我们创建连接池对象,(管理连接池)
加载外部配置文件 固定写法classpath:配置文件名 表示引用类路径下的资源
首先编写外部配置文件
注意:username是spring中的关键字,因此key名称不能为username,为了防止配置文件中的key和spring自己的关键字冲突我们可以给key值加前缀
之后ioc容器中引入
实验十三:基于xml的自动装配(自动赋值)
自动装配(自动赋值,仅限于对自定义类型的属性有效)
autowire=“default”/“no”:不自动装配,不自动为car赋值
autowire=“byName”:按照名字自动装配
类中的属性名为private Car car,会在容器中找id等于这个(car)这个属性名的组件将它
自动赋值给bean;如果找不到则为null
autowire=“byType”:按照类型自动装配
以类中的属性类型去找到同样类型的组件,并将组件自动赋值给bean
但是如果容器中有多个这个类型的组件则会报错
如果没找到则为null
autowire=“constructor”:按照构造器进行赋值
public Person(Car car)
1)先按照有参构造器参数的类型进行装配,如果这个类型在容器中存在则会自动装配没有即为null
2)如果按照类型找到多个,参数的名作为id继续匹配;找到就装配没有则为null
好处为不会报错
如:
设置为autowire 自动装配后,无需手动进行赋值,IOC容器会自动进行装配
实验十四 SpEL测试(Spring Expression Language)Spring表达式语言
在SpEL中使用字面量
引用其他bean的某个属性值
引用其他bean
调用静态方法
调用非静态方法
实验十五:通过注解分别创建Dao,Service,Controller(重要)
通过给bean上添加某些注解,可以快速的将bean加入到ioc容器中
某个类上添加上任何一个注解都可以快速的将这个组件加入到ioc容器的管理中
Spring中有四个注解
@Controller 控制器,我们推荐给控制器层(servlet包下的)组件加这个注解
@Service 业务逻辑,我们推荐给业务逻辑层的(service包下的)组件添加这个注解
@Repository 给数据库层(持久化层、dao层)的组件添加这个注解
@Component 给不属于以上几层的组件添加这个注解
注解可以随便加,Spring底层不会去验证你这个组件
是否如你注解所说就是一个dao层的或者是一个service层的组件
但是我们推荐各自层加各自的注解,便于代码阅读
使用注解将组件快速加入到容器中需要一下几步:
1)给要添加的组件上标注解
2)告诉spring,自动扫描加了注解的组件,依赖context名称空间
3)一定要导入aop包不然会报错
如何修改通过注解加入到容器中的组件的默认名称呢?
注解("新的名称")
@Controller("bookServlet222")
如何变为多实例呢?
@Scope(value = "prototype")
注意:一定要进行自动组件扫描
context:component-scan:自动组件扫描
base-package:指定扫描的基础包:把基础包及他下面所有的包的所有加了注解的类自动扫描进ioc容器中
仅写一次
实验十六:使用context:include-filter指定扫描包时要包含的类
指定只扫描进入哪些组件默认都是全部扫描进来,一定要禁用默认过滤规则use-default-filters=“false”
实验十七:使用context:exclude-filter指定扫描包时不包含的类
扫描的时候排除一些不要的组件
type="annotation":指定排除规则,按照注解进行排除。标注了指定注解的组件不要
expression="注解的全类名"
type="assignable":指定排除某个具体的类
expression="类的全类名"
不常用:
type="aspectj"后来aspectj表达式
type="custom" 自定义一个TypeFilter;自己写代码决定哪些是否使用
type="regex" 还可以写正则表达式
实验十八:使用@Autowired注解实现根据类型实现自动装配(重点)
@Autowired的使用
@Autowired
private BookService bookService;
@Autowired的原理
先按照类型去容器中找到对应的组件;bookService=ioc.getBean(BookService.class);
①找到就赋值
②没找到就抛异常
③找到多个?
1)找到多个则会按照变量名作为id继续匹配
[1]按id找未找到就会报错,可以使用@Qualifier指定一个新的id
如果使用了@Qualifier还是找不到就会报错
[2]按id找找到了,自动装配
发现@Autowired标注的自动装配的属性默认是一定装配上的
找到就装配
找不到就报错误提示
@Autowired(required=false)找不到就自动装配null
(@Autowired注解的required属性指定某个属性运行不被设置)
注意:
如果资源类型的bean不止一个,默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配(重点)
如果根据成员变量名作为id还是找不到bean:
可以使用@Qualifier注解明确指定目标bean的id(重点)
@Qualifier:指定一个名作为id,让spring别用变量名作为id,根据这个id找到指定的bean
@Qualifier("id名")
方法上有@Autowired的话
1)这个方法也会在bean创建的时候自动运行
2)这个方法上的每一个参数都会自动注入值
在方法的形参位置使用@Qualifier注解:
会根据@Qualifier中的id查找相关的bean并注入值
@Autowired @Resource 都是自动装配的意思,其中的区别
@Autowired:最强大,是spring自己的注解
@Resource:是j2ee,java的标准
@Resource的扩展性更强因为是java的标准,如果切换成另一个容器框架,@Resource仍然可以使用
但是@Autowired则不行
实验十九:测试泛型依赖注入(重点)
依赖注入两个对象,BookService和UserService类均继承BaseService类,BaseService类为泛型类
输出带泛型的父类类型com.springstudy.service.BaseService<com.springstudy.bean.Book>
spring中可以使用带泛型的父类类型来确定这个子类的类型