【Spring】Spring复习第二天

如果对此文感兴趣,可以继续看下一篇博文,持续更新,新手学习,有问题欢迎指正:
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[ ]:用于指定其他配置类的字节码。
  1. 通过注解获取容器
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 文件中。

猜你喜欢

转载自blog.csdn.net/renjingjingya0429/article/details/90138698