注解方式相较于XML方式更方便
各有什么优缺点?分别应用于什么场景?
注解的使用:
1、导包
在pom.xml中引入Spring-aop依赖,因为Spring的注解是通过aop来实现的
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2、开启注解的包扫描(大大减少applicationContext.xml配置的代码量)
(1)引入命名空间及文件
一个xml要有效的话,有两种方式:①DTD②Scheme
(自动生成的是Scheme的方式)
需要用到context的命名空间(默认是没有的)
故要引入一个新的命名空间以及2个新的Scheme的文件
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
可能出现的错误
(正常来说这样是ok的,但是,我出现了Ignored XML validation warning的错误,经过一番查找,于是乎,发现要把上图中最后一行的https改成http才能使注解成功运行。。。目前还不清楚原因)
(2)编写代码开启
扫描base-package中的所有的注解
<context:component-scan base-package="org.csu.spring.demo.ioc"/>
3、使用注解
(1)@Component:一个组件,用来声明,注解某一个类是个Bean,需要容器来进行管理,相当于Bean的定义
如果没有@Value(注入值方式的注解)的话,account各属性的值就是默认的null或0
一个类被Component注解,是一个普通的Java类
@Component的子注解有以下三种:
①@Controller
一个类被其注解,Spring-IoC会把它认为是Servlet,一个控制器
②@Repository
一个类被其注解,Spring-IoC会把它认为是DAO层的一个类
③@Service
一个类被其注解,Spring-IoC会把它认为是业务层的一个类
(在面向接口的方式下,注解要写在实体类上,不要写在接口上面)
(2)注入对象的注解
①@Autowired:自动注入按类型去搜索,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
不适合有多种类型的情况
当搜索不到时,它可能把null值放进去
②@Resource(name=“accountDAO”):按名称去指定(不写括号中的内容也可以实现)
补充:Spring和junit的test一起使用时可以简化
1、在pom.xml中导入用于测试的包
2、修改测试类中的代码
加入如下两条注解
用于替换
而原先需要context怎么办呢?
解决方法:再次添加注解
即可直接使用accountService,此时可以将 上上图中的语句省去