由于没有找到对应的源码,所以只能简单把笔记写上
实验15:通过注解分别创建Dao、Service、Controller(控制器:控制网站跳转逻辑)★ 实验16:使用context:include-filter指定扫描包时要包含的类 实验17:使用context:exclude-filter指定扫描包时不包含的类 实验18:使用@Autowired注解实现根据类型实现自动装配★ 实验19:如果资源类型的bean不止一个, 默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配★ 实验20:如果根据成员变量名作为id还是找不到bean, 可以使用@Qualifier注解明确指定目标bean的id★ 实验21:在方法的形参位置使用@Qualifier注解 实验22:@Autowired注解的required属性指定某个属性允许不被设置
实验15:通过注解分别创建Dao、Service、Controller(控制器:控制网站跳转逻辑)★
通过给bean上添加某些注解,可以快速的将bean加入ioc容器中---xml文件
某个类上添加任何一个注解都能快速将这个组件加入到ioc容器中
Spring有4个注解
①普通组件:@Component
给不属于以下几层的组件添加这个注解
②持久化层组件:@Respository
给数据库层(持久化层 Dao层)的组件添加这个注解 BookDao.java
③业务逻辑层组件:@Service
推荐业务逻辑层组件添加这个注解 BookService.java
④表述层控制器组件:@Controller
控制器层的组件(servlet包下)添加这个注解 BookServlet.java
⚠️注意:注解可以随便加,事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,
即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,
所以@Respository、@Service、@Controller这几个注解仅仅是为了让程序员看的。
使用注解将组件(类)快速加入到容器的步骤:
1)给要添加的组件上标四个注解中任何一个
2)告诉Spring,自动扫描添加了注解的组件:依赖context名称空间(在Namespace里面导入context)
context名称 <context:component-scan base-package=""></context:component-scan>
context:component-scan 自动扫描组件
base-package 指定扫描的基础包:把基础包及他下面所有的包所有加了注解的类,自动扫描进ioc容器
3)一定要导入aop包,它支持注解模式
在IOCTest.java中测试
getBean(id)
加了注解的组件的简单类名首字母小写后得到的字符串作为bean的id
比如 ioc. getBean("bookDao")
使用注解加入容器中的组件🆚使用配置加入容器中组件
行为都是默认一样的
1、组件id,默认就是组件的类名首字母小写
2、组件的作用域,默认就是单例
要改名字--直接在注解改 @Respository("bookdaohhhh")
要改多例--@Scope(value="prototype")
⚠️只有自己写的代码才能加注解
实验16:使用context:include-filter指定扫描包时要包含的类
实验17:使用context:exclude-filter指定扫描包时不包含的类
实验16:使用context:include-filter指定扫描包时要包含的类
只扫描进入哪些组件,默认是全部扫描进来
一定要禁用默认过滤规则--use-default-filter = "false"就可以解决
<context:component-scan base-package="com.atguigu" use-default-filter="false">
<context:include-filter type="annotation" expression=""/>
</context:component-scan>
实验17:使用context:exclude-filter指定扫描包时不包含的类
扫描的时候可以排除一些不要的组件
type="annotation"指定排除规则:按照注解进行排除。标注了指定注解的组件都不要
expression="" 注解的全类名
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression=""/>
</context:component-scan>
type="assignable"
expression="" 类的全类名
type="custom" 自定义一个TypeFilter,自己写代码决定哪些使用
type="regex" 表示可以写正则表达式
🌟由于除了实验21,这几个实验都是相关联的,所以放在一起
实验18:使用@Autowired注解实现根据类型实现自动装配★
实验19:如果资源类型的bean不止一个, 默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配★
实验20:如果根据成员变量名作为id还是找不到bean, 可以使用@Qualifier注解明确指定目标bean的id★
实验22:@Autowired注解的required属性指定某个属性允许不被设置
实验18:使用@Autowired注解实现根据类型实现自动装配★ DI依赖注入
BookServlet里面有BookService
BookService里面有BookDao
@Autowired自动装配,Spring自动为这个属性赋值--是去容器中找到这个属性对应的组件
--不用new一个,也不用在每个类写getter setter方法
@Autowired原理分析
@Autowired
private BookService bookService;
1)先按照类型去容器中找到对应的组件: bookService = ioc.getBean(BookService.class);
(1) 找到一个:找到就赋值
(2) 没找到,报异常
(3)找到多个,运行没报错,装配上了
为什么?
<1>🌟按照变量名作为id继续匹配:BookService 和 BookServiceExt 🌟实验19🌟
---变量名分别为bookService 和 bookServiceExt 所以BookService(bookService) ☑️
《1》匹配上,装配
《2》没有匹配--报错--原因是因为我们按照变量名作为id继续匹配---🌟实验20🌟
@Autowired
private BookService bookServiceExt2;
🌟解决方法:使用@Qualifier("bookService")指定一个新id
@Qualifier("bookService")
@Autowired
private BookService bookServiceExt2;
【1】找到,装配
【2】找不到,报错
但是@Autowired标注的自动装配的属性默认是一定装配上的
找到就装配,找不到就null---🌟实验22🌟
🌟解决方法:@Autowired(required=false)
@Qualifier("bookServiceHaha")
@Autowired(required=false)
private BookService bookServiceExt2;
实验21:在方法的形参位置使用@Qualifier注解
实验21:在方法的形参位置使用@Qualifier注解
定义的方法上有@Autowired的话:
(1)这个方法也会在bean创建时候自动运行
(2)这个方法的每一个参数都会自动注入值
@Autowired
private void hahahha(BookDao bookDao,@Qualifier("bookServiceExt")BookService bookService){
System.out.println("hhhh")
}