欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习spring(3)基于注解的ioc配置

程序员文章站 2024-01-03 15:53:22
...

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 方式的比较:
学习spring(3)基于注解的ioc配置

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 文件中。

相关标签: 自学Spring spring

上一篇:

下一篇: