学习spring(3)基于注解的ioc配置
文章目录
1基于注解的ioc配置
注意:在基于注解的配置中,我们还要多引进一个 aop 的 jar 包。
spring-aop-5.0.2.RELEASE.jar
<!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中
而是一个名称为context名称空间和约束中-->
<context:component-scan base-package="com.Dao.....">
</context:component-scan>
1.1用于 创建对象的注解
相当于
<bean id="" class="">
aaa@qq.com
作用:把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
属性:value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
aaa@qq.com @Service @Repository
他们的作用及属性都是一模一样的,只不过是提供了更加明确的语义化。
@Controller:一般用于表现层的注解。
@Service:一般用于业务层的注解。
@Repository:一般用于持久层的注解。
细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写
1.2用于 注入数据的注解
相当于
<property name="" ref="">
<property name="" value="">
1 @Autowired
作用:自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错
2 @Qualifier
作用:
在 @Autowired 的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
属性:
value:指定 bean 的 id。
3 @Resource
作用:
直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
属性:
name:指定 bean 的 id。
4 @Value
作用:
注入基本数据类型(int double)和 String 类型数据的
属性:
value:用于指定值
1.3用于 改变作用范围 的注解
相当于
<bean id="" class="" scope="">
@Scope
作用:
指定 bean 的作用范围。
属性:
value:指定范围的值。
取值:singleton prototype request session globalsession
1.4用于 生命周期 的注解 (了解)
<bean id=" " class=" " init-method=" " destroy-method=" " />
== @PostConstruct==
用于指定初始化方法。
== @PreDestroy==
用于指定销毁方法
2.注解配置 和 xml配置 对比
注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于到底使用哪种配置,每个公司有不同的习惯,都掌握就好了。
注解的优势:
配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。
XML 的优势:
修改时,不用改源码。不涉及重新编译和部署。
Spring 管理 Bean 方式的比较:
3.其他注解(略)
@Configuration
@ComponentScan
@Bean
@PropertySource
@Import
4. Spring 整合 Junit
问题
在测试类中,每个测试方法都有以下两行代码,这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountService",IAccountService.class);
解决思路分析
针对上述问题,我们需要的是程序能自动帮我们创建容器。一旦程序能自动为我们创建 spring 容器,我们就无须手动创建了,问题也就解决了。我们都知道,junit 单元测试的原理(在 web 阶段课程中讲过),但显然,junit 是无法实现的,因为它自己都无法知晓我们是否使用了 spring 框架,更不用说帮我们创建 spring 容器了。不过好在,junit 给我们暴露了一个注解,可以让我们替换掉它的运行器。这时,我们需要依靠 spring 框架,因为它提供了一个运行器,可以读取配置文件(或注解)来创建容器。我们只需要告诉它配置文件在哪就行了。
1.导入
spring-aop-5.0.2.RELEASE.jar
spring-test-5.0.2.RELEASE.jar
2.使用@RunWith 注解替换原有运行器
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
}
3.使用@ContextConfiguration 指定 spring 配置文件的位置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
//或者
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
}
4.使用@Autowired 给测试类中的变量注入数据
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
//或者
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
@Autowired
private IAccountService as ;
}
5.把测试类配到 xml 中?
为什么不采用配置到 xml 中的方式呢?
第一:当我们在 xml 中配置了一个 bean,spring 加载配置文件创建容器时,就会创建对象。
第二:测试类只是我们在测试功能时使用,而在项目中它并不参与程序逻辑,也不会解决需求上的问题,所以创建完了,并没有使用。那么存在容器中就会造成资源的浪费。
所以,基于以上两点,我们不应该把测试配置到 xml 文件中。