如果对此文感兴趣,可以继续看下一篇博文,持续更新,新手学习,有问题欢迎指正:
https://blog.csdn.net/renjingjingya0429/article/details/90177176
一、基于注解的IOC配置
常用注解
1. 用于创建对象的(相当于<bean id="" class="’>)
-
@Component
- 作用:把资源让Spring 来管理。相当于在XML中配置一个bean。
- 属性:value:指定bean的id。如果不指定value属性,默认bean 的id 是当前类的类名,首字母小写。
-
@Controller @Service @Repository
他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。
他们只不过是提供了更加明确的语义化。
- @Controller:一般用于表现层的注解。
- @Service:一般用于业务层的注解。
- @Repository:一般用于持久层的注解。
细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。
2. 用于注入数据的(相当于<property name="" red="’> <property name="" value="’>)
- @Autowired
- 作用:自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在Spring容器查找,找到了也可以注入成功,找不到就报错。
- @Qualifier
- 作用:在自动按照类型注入的基础上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowired 一起使用,但是给方法参数注入时,可以独立使用。
- 属性:value:指定bean的id。
- @Resource
- 作用:直接按照bean的id注入。它也只能注入其他bean类型。
- 属性:name:指定bean 的id 。
- @Value
- 作用:注入基本数据类型和String类型数据的。
- 属性:value:用于指定值。
3. 用于改变作用范围的(相当于 )
- @Scope
- 作用:指定bean 的作用范围。
- 属性:value:指定范围的值。取值:Singleton、prototype、request、session、globalsession
4. 和生命周期相关的(相当于)
- @PostConstruct
作用:用于指定初始化方法。 - @PreDestory
作用:用于指定销毁方法。
5. 关于Spring注解和XML的选择问题
- 注解的优势:
配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。 - XML的优势:
修改时,不用改源码。不涉及源码重新编译和部署。 - Spring管理bean方式的比较:
6. 一些问题
我们基于注解的IOC依然离不开XML 配置文件,能否去掉这个配置文件,所有的配置都使用注解来实现?下面的新注解就可以解决这些问题。
7. 新注解说明
-
@Configuration
- 作用:用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有Configuration注解的类.class)。
- 属性:
value:用于指定配置类的字节码。
-
@ComponentScan
- 作用:用于指定Spring在初始化容器时要扫描的包。作用和在Spring的XML配置文件中的。<context:component-scan base-package=“com.itheima”/>是一样的。
-
@Bean
- 作用:该注解只能写在方法上,表明使用此方法创建一个对象(将该方法的返回值放入Spring 容器),并且放入Spring 容器。
- 属性:name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
-
@PropertySource
- 作用:==用于加载.properties文件中的配置。==例如我们配置数据源时,可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
- 属性:value[ ],用于指定properties文件位置。如果是在类路径下,需要写上classpath;
-
@Import
- 作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。
- 属性:value[ ]:用于指定其他配置类的字节码。
- 通过注解获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfigration.class);
二、Spring整合Junit
1. 第一步:在项目中加入整合Junit的必备jar包。
此处需要注意的是,导入 jar 包时,需要导入一个 spring 中 aop 的 jar 包。
2. 第二步:使用@RunWith注解换原有运行器
/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
}
3. 第三步:使用@ContextConfigration指定Spring配置文件的位置
/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
}
@ContextConfigration注解
- location属性:用于指定配置文件的位置,需要用classpath:表明。
- classes属性:用于指定注解的类。当不使用XML配置时,需要用此属性指定注解类的位置
4. 第四步:使用@Autowired给测试类中的变量注入数据
/**
* 测试类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
@Autowired
private IAccountService as ;
}
5. 为什么不把测试类配到 xml 中?
在解释这个问题之前,先解除大家的疑虑,配到 XML 中能不能用呢?
答案是肯定的,没问题,可以使用。
那么为什么不采用配置到 xml 中的方式呢?
第一:当我们在 xml 中配置了一个 bean,spring 加载配置文件创建容器时,就会创建对象。
第二:测试类只是我们在测试功能时使用,而在项目中它并不参与程序逻辑,也不会解决需求上的问
题,所以创建完了,并没有使用。那么存在容器中就会造成资源的浪费。
所以,基于以上两点,我们不应该把测试配置到 xml 文件中。