美文网首页
Spring(二) 注解

Spring(二) 注解

作者: So_ProbuING | 来源:发表于2019-12-10 17:08 被阅读0次

Spring(二) 注解

Spring中常用注解介绍

Spring中的注解配置和xml配置要实现的功能是一样的

注解开发环境

引入maven坐标

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>

开启组件扫描

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

IOC注解说明

IOC注解都必须放在想要被IOC容器管理的类上:

  • @Component 非三层模式范围的类上使用

意思就是告诉spring,利用这个类创建一个对象,并且将对象放到spring的IOC容器中。

相当于xml中的<bean id="accountDao" class=""/> 可以使用这种形式指定一个id,如果不指定默认为类名首字母小写

  • @Controller 标注在表现层的类上
  • @Service 标注在业务层的类上
  • @Repository 标注在持久层的类上

bean对象作用域注解

  • @Scope 用于指定bean的作用范围,相当于配置文件中的<bean scope=""/>

bean对象创建创建后和摧毁前触发行为

  • @PostConstruct bean对象创建后触发行为
  • @PreDestory bean对象摧毁前触发行为
<bean init-method="init" destroy-method="destory"/>

DI注解说明

DI注解都相当于直接给属性赋值,而无需借助于set方法或构造方法

  • @Autowired

    • 放在属性上:

      表示先按照类型给属性注入值【by type】

      如果找到了,而且正好找到了一个,那么就就行依赖注入

      如果IOC容器中存在多个与属性同类型的对象,则会按照属性名注入值【by name】

      也可以配合@Qualifier("IOC容器中对象id")注解直接按照名称注入值

    • 放在方法上:

      • 表示自动执行当前方法
      • 如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值,也可以在参数上添加
      • 如果没有查到,就报错,如果找到了并且正好找到1个就进行注入如果找到了但是找到了多个,按照当前属性的名称和IOC容器中bean对象的id进行匹配
      • @Qualifier("IOC容器中对象id")注解按照名称寻找对象给参数传值
  • @Resource(Java9以后废弃了)

    ​ 只能放在属性上,表示先按照属性名匹配IOC容器中对象id给属性注入值【by name】

    ​ 若没有成功,会继续根据当前属性的类型匹配IOC容器中同类型对象来注入值【by type】

    ​ 若指定了name属性@Resource(name="对象id")则只能按照对象id注入值

  • @Value

    用于简单数据类型的注入,相当于<property name="" value="">,此注解一般用于解析其他properties配置文件中的key值俩获取对应的value

测试案例

Spring配置文件applicationContext.xml配置

<!--    配置注解扫描 配置扫描全部包-->
    <context:component-scan base-package="com.itheima"/>

使用注解将dao放入容器

@Repository
public class AccountDaoImpl implements AccountDao 

使用注解将service放入容器

@Service
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;

测试

@Test
    public void testFindAll() {

        //启动Spring容器
        ApplicationContext act =
                new ClassPathXmlApplicationContext("applicationContext.xml");

        AccountService service = act.getBean(AccountService.class);

        List<Account> accounts = service.findAll();
        for (Account account : accounts) {
            System.out.println(account);
        }
    }

Spring新注解

@Configuration

用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解,被这个标签标注的类,会在Spring容器启动的时候,自动加载

@Bean

该注解只能写在方法上,表明使用此方法创建一个对象,并且放入Spring容器。它支持一个name属性,用于给生成的bean取一个id

Bean只能标注在方法上,用于将当前方法返回的对象,返回的对象放入Spring的IOC容器

可以使用@Bean(id)来指定当前对象在容器中的id,如果不指定,默认是当前方法的名称。

它还完全有@Autowired标注在方法上的作用

@ComponentScan

组件扫描注释,相当于xml配置文件中的<context:component-scan base-package=""/>

@PropertySource

用于加载.properties文件中的配置。

@Import

在一个配置类中引入其他配置

Spring纯注解开发

创建DBConfig

//自动加载配置
@Configuration
@PropertySource("db.properties")
public class DBConfig {
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String name;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.driver}")
    private String driver;

    @Bean("dataSource")
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setPassword(password);
        dataSource.setUsername(name);
        dataSource.setUrl(url);
        return dataSource;
    }

    public QueryRunner getQueryRunner(@Qualifier("dataSource") DataSource dataSource) {
        return new QueryRunner(dataSource);
    }
}

创建java类作为配置类

@ComponentScan("com.itheima")
@Import(DBConfig.class)
public class SpringConfig {

}

测试

 @Test
    public void findByName() {
        ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService service = act.getBean(AccountService.class);
        Account account = service.findByName("test2");
        System.out.println(account);
    }

Spring整合Junit

引入坐标

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>

在测试类上使用@RunWith指定Spring的单元测试运行器

@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
}

使用@ContextConfiguration指定配置文件,它支持文件和类的形式

//指定配置文件
@ContextConfiguration(classes = SpringConfig.class)

可以使用@Autowired直接注入需要的bean

 @Autowired
    private AccountService service;

    @Test
    public void testFindByName() {
        System.out.println(service.findByName("test1").toString());
    }

相关文章

网友评论

      本文标题:Spring(二) 注解

      本文链接:https://www.haomeiwen.com/subject/lbvggctx.html