Spring2


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


注解简化配置

用处

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

  <!--像这些配置都可以用注解代替-->
  <bean name="car" class="cn.itcast.bean.Car"  >
    <property name="name" value="布加迪威龙" ></property>
    <property name="color" value="black"  ></property>
  </bean>

使用注解的准备工作

导包

正常的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中配置

  <!-- 指定扫描cn.itcast.bean报下的所有类中的注解.
     注意:扫描包时.会扫描指定包下的所有子孙包
   -->
  <context:component-scan base-package="cn.itcast.bean"></context:component-scan>

使用

注册对象

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

等效于

<bean name="user" class="cn.itcast.bean.User"  />

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的引用类型只有一个,可以使用,如果有多个,就不好用。比如

  <bean name="car1" class="cn.itcast.bean.Car"/>
  <bean name="car2" class="cn.itcast.bean.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("我是销毁方法!");
  }
  ...
}

相当于

  <bean  
    name="user" 
    class="cn.itcast.bean.User" 
    init-method="init" 
    destroy-method="destory" >
  </bean>

@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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,047评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,338评论 6 342
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,899评论 2 22
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 2,704评论 0 8
  • 第一次发文,大家不要喷我,谢谢 今天和友人相约吃饭,突然说起一个话题,为什么还不找个男票,我回答到“当我能一个人熬...
    西兰花姑凉阅读 140评论 0 0

友情链接更多精彩内容