spring-03 IOC注解相关

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31463999/article/details/87930270

1.基于注解的IOC配置

1.1 applicationContext.xml

<!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为context名称空间和约束中-->
 <!--<context:annotation-config> 和 <context:component-scan>的区别-->
    <!--<context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注解。-->
    <!--<context:component-scan>除了具有<context:annotation-config>的功能之外,<context:component-scan>还可以在指定的package下扫描以及注册javabean 。-->
    <!--<context:annotation-config/>-->
    <context:component-scan base-package="com.myx"></context:component-scan>

1.2 类添加注解

在这里插入图片描述

1.2.1 @Component

用于把当前类对象存入spring容器中
属性:value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。

1.2.2 Spring中提供了@Component的衍生注解

  • @Controller:用来修饰WEB层类(控制层)(springMVC延用了该注解)
  • @Service:用来修饰service层类(业务层)
  • @Repository:用来修饰DAO层类(持久层)

以上三个注解他们的作用和属性与Component是一模一样。
他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰。

1.3 测试方法

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 描述:测试注解bean
 * @author: myx
 * @date: 2019/1/10
 * 注意:本内容仅限于学习使用
 * Copyright © 2019-myx. All rights reserved.
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 【ApplicationContext 接口的实现类 】
         (1)ClassPathXmlApplicationContext:
         它是从类的根路径下加载配置文件 推荐使用这种
         (2)FileSystemXmlApplicationContext:
         它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。注意磁盘的权限
         (3)AnnotationConfigApplicationContext:
         当我们使用注解配置容器对象时,需要使用此类来创建spring 容器。它用来读取注解。
         */
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloSpringAnn bean = ac.getBean(HelloSpringAnn.class);
        System.out.println(bean);

    }
}

2.注解配置-依赖注入

2.1 @Autowired

自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功,如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错,如果Ioc容器中有多个类型匹配时:
先按照类型匹配,如果不能匹配上,会按照属性的名称进行匹配

  • 出现位置:可以是变量上,也可以是set方法上

  • 细节:在使用注解注入时,set方法就不是必须的了。

  • 注入集合

    第一步:
    @Bean
    Public List<User> createList(){
        // 组织数据
        List<User> list = new ArrayList<User>();
        return list;
    }
    第二步:
    @Autowired
    private List<User> list;
    

2.2 @Qualifier

在按照类中注入的基础之上再按照名称注入。
属性:value:用于指定注入bean的id。

在这里插入图片描述

2.3 @Resource

直接按照bean的id注入。如果id属性不存在,可以再按照类型注入。它可以独立使用
属性:name:用于指定bean的id,如果指定name,只能按照bean的id注入,不能按照类型注入。

以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现(使用@Value)

2.4 @Value

用于注入基本类型和String类型的数据
属性:value:用于指定数据的值。使用${表达式}可以读取配置文件(.properties文件)的信息

@Value(value = "myx")
private String name;
@Value(value = "18")
private Integer age;

2.4.1 @Value("#{}")与@Value("${}")的区别

区别

3.注解配置-作用域

3.1 @Scope

用于指定bean的作用范围
属性:value:指定范围的取值。常用取值:singleton prototype

在这里插入图片描述

4.注解配置-初始化和销毁(单例)

@PostConstruct
public void  init(){
    System.out.println("初始化方法执行了");
}

@PreDestroy
public void  destroy(){
    System.out.println("销毁方法执行了");
}

5.配置文件引用

使用import加载多个applicationContext.xml

让程序加载多个spring的配置文件,对spring的配置文件细分

  • applicationContext.xml:加载第三方的配置(数据源、QueryRunner)
  • applicationContext-dao.xml:加载自己创建的Dao对象
  • applicationContext-service.xml:加载自己创建的Service对象
<!--加载其他spring的配置文件-->
<import resource="classpath:applicationContext-service.xml"></import>
<import resource="classpath:applicationContext-dao.xml"></import>

6.使用spring的注解配置,去掉applicationContext.xml中所有配置(springboot基础)

6.1 配置类

表示该类是一个配置类,它的作用和applicationContext.xml是一样的

@Configuration
@ComponentScan(value = {"com.myx"})
public class SpringConfiguration {

}

6.1.1 @Configuration注解

作用:指定当前类是一个配置类,如同applicationContext.xml中的配置
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。

6.1.2 @ComponentScan

用于通过注解指定spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包的范围。
我们使用此注解就等同于在xml中配置了:

<context:component-scan base-package="com.itheima"></context:component-scan>

6.1.3 @Bean

用于把当前方法的返回值作为bean对象存入spring的ioc容器中.
属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称
依赖注入细节:
我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象,如果有bean对象,将对象通过方法的形参注入到方法中使用。查找的方式和Autowired注解的作用是一样的

/**
 * 创建数据源对象
 * @return
 */
@Bean(name="ds")
public DataSource createDataSource(){
    try {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/itcastspring");
        ds.setUser("root");
        ds.setPassword("root");
        return ds;
    }catch (Exception e){
        throw new RuntimeException(e);
    }
}

6.2 测试

public class AccountServiceTest {


    @Test
    public void testFindAll() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        HelloSpringAnn bean = ac.getBean(HelloSpringAnn.class);
        System.out.println(bean);
    }
}

6.3 @Import注解

用于导入其他的配置类

属性:value:用于指定其他配置类的字节码。
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
相当于:

applicationContext.xml中的<import resource=””>
public class JdbcConfig {

    /**
     * 用于创建一个QueryRunner对象
     * @param dataSource
     * @return
     */
    @Bean(name="runner")
    @Scope("prototype")
    public QueryRunner createQueryRunner(DataSource dataSource){
        return new QueryRunner(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name="ds")
    public DataSource createDataSource(){
        try {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/itcastspring");
            ds.setUser("root");
            ds.setPassword("root");
            return ds;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

@ComponentScan(value = {"com.nyx"})
@Import(value= JdbcConfig.class)
public class SpringConfiguration {

}

6.4 @PropertySource

用于指定properties文件的位置
属性:value:指定文件的名称和路径。关键字:classpath,表示类路径下

@ComponentScan(value = {"com.myx"})
@Import(value= JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {

}

6.5 @Qualifier

如果spring容器中出现了多个数据源类型,使用该注解指定注入的数据源。

@Bean(name="runner")
@Scope("prototype")
public QueryRunner createQueryRunner(@Qualifier(value = "ds2") DataSource dataSource){
    return new QueryRunner(dataSource);
}

7.使用spring整合Junit

7.1 添加maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

7.2 使用

/**
 * 使用Junit单元测试:测试我们的配置
 * Spring整合junit的配置
 *      1、导入spring整合junit的jar(坐标)
 *      2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
 *          @Runwith
 *      3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
 *          @ContextConfiguration
 *                  locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
 *                  classes:指定注解类所在地位置
 *
 *   当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {

    @Autowired
    private AccountService as;


    @Test
    public void testFindAll() {
        //3.执行方法
        List<Account> accounts = as.findAllAccount();
        for(Account account : accounts){
            System.out.println(account);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31463999/article/details/87930270
今日推荐