Spring2


layout: post
title: spring2
subtitle: 注解
date: 2018-06-14
author: ZL
header-img: img/20180614.jpg
catalog: true
tags:
- spring
- 注解


注解简化配置

用处

用注解可以代替applicationContext.xml中的一些配置。

  
  
    
    
  

使用注解的准备工作

导包

正常的spring包+spring-aop

image

新的xml约束(content)

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">

applicationContext.xml中配置

  
  

使用

注册对象

@Component("user")
//@Service("user") // service层
//@Controller("user") // web层
//@Repository("user")// dao层
public class User {
    private String name;
    private Integer age;
    private Car car;
    ....
  ...
}

等效于


Component、Service、Controller、Repository的作用完全一样,只是名字不一样,可以用来区分不同的Bean类所处的层次,方便开发者搞清楚类的作用。service在service层,Controller在web层,Repository在dao层。

使用的话还是和以前一样

//1 创建容器对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//2 向容器"要"user对象
User u1 = (User) ac.getBean("user");

修改对象的作用范围(默认单例)

@Scope(scopeName="singleton")
public class User {
    private String name;
    private Integer age;
    private Car car;
    ....
  ...
}

属性的值注入

public class User {
  @Value("tom") //方式一
    private String name;
    private Integer age;
    private Car car;
    ....
  @Value("tom") //方式二
  public void setName(String name) {
    this.name = name;
  }
  ...
}

两种方式都可以

还可以引资源文件的值@InportResource和@Value组合使用

然后在xml里面引入资源文件地址

引用类型的属性的值注入

public class User {
    private String name;
    private Integer age;
  //@Autowired //自动装配
  //问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象.
  //@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象
  @Resource(name="car")//手动注入,指定注入哪个名称的对象
    private Car car;
    ....
  ...
}

Autowired自动装配,如果car的引用类型只有一个,可以使用,如果有多个,就不好用。比如

  
  

Qualifier和Resource都可以直接指定名称,推荐使用

Autowired和Resource都可以单独使用,Qualifier不能单独使用,要和Autowired结合在一起使用。


初始化和销毁时的方法

public class User {
    ....
  @PostConstruct //在对象被创建后调用.init-method
  public void init(){
    System.out.println("我是初始化方法!");
  }
  @PreDestroy //在销毁之前调用.destory-method
  public void destory(){
    System.out.println("我是销毁方法!");
  }
  ...
}

相当于

  
  

@configuration和@bean

bean类:注意是没有添加@Component注解的

//@Component
public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

BeanConfig类:在这里把User通过Configuration和Bean的组合使用加到spring里面去,就相当于直接在User类上面加@Component注解

@Configuration
public class BeanConfig {
    @Bean("user")
    public User getUser(){
        return new User();
    }
}

调用:

    @Autowired
    @Qualifier("user")
    private User user;
    
    @org.junit.Test
    public void demo(){
        user.setName("yyy");
        System.out.println(user.getName());
    }

@Named @Inject

@Named==@Component
@Inject==@Resource

Spring整合Junit

作用就是用注解的方式简化下面的代码,不是必须的,可以不管

@Test
public void fun1() {
  ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  User user1 = (User) applicationContext.getBean("user");
  User user2 = (User) applicationContext.getBean("user");
  System.out.println(user1);
  applicationContext.close();
}

导包

spring-test-4.2.4.RELEASE.jar

代码

//-----------------------------------------
//帮我们创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定创建容器时使用哪个配置文件,大概相当于ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
@ContextConfiguration("classpath:applicationContext.xml")
//------------------------------------------
public class Demo {
  
  //---------------------------------
  //将名为user的对象注入到u变量中,大概相当于User u = (User) applicationContext.getBean("user");
    @Resource(name = "user")
  //---------------------------------
    private User u;
    
    @Test
    public void fun2() {
    //直接可以使用了,简化了获取user对象的代码
        System.out.println(u);
    }
}

你可能感兴趣的:(Spring2)