[Spring学习笔记]@Autowired

原创 2016年08月30日 09:54:41

Spring中@Autowired的用法

首先确定一下需求

一共有三个对象:Car、Person、Company
Car有name和code两个属性;Person有name和age两个属性;Company有Car和Person两个属性,作为测试输出类。
需要实现的输出为:

Car [name=Car_A, code=10]
Person [name=Person_A, age=20]

Car和Person两个类的代码如下:
Car.class

package com.Spring;
public class Car {
    private String name;
    private int code;

    public String getName() {
        return name;
    }

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

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String toString() {
        return "Car [name=" + name + ", code=" + code + "]";
    }

}

Person.class

package com.Spring;

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

不使用Spring框架的情况

在不使用Spring的时候,在不更改Car和Person两个类的情况下,我们需要这样写Company的代码:

package com.Spring;

public class Company {

    private Car car;
    private Person person;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public static void main(String[] args) {
        Company company = new Company();
        Car car = new Car();
        car.setCode(10);
        car.setName("Car_A");
        company.setCar(car);
        Person person = new Person();
        person.setAge(20);
        person.setName("Person_A");
        company.setPerson(person);
        System.out.println(company.car.toString());
        System.out.println(company.person.toString());
    }

}

这样既可完成上面说到的输出。

使用 Spring但不使用@Autowired

首先我们需要先写明需要注册的类,创建Beans.xml 并完成如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />

    <bean id="CarBean" class="com.Spring.Car">
        <property name="name" value="Car_A" />
        <property name="code" value="10" />
    </bean>
    <bean id="PersonBean" class="com.Spring.Person">
        <property name="name" value="Person_A" />
        <property name="age" value="20" />
    </bean>
    <bean id="CompanyBean" class="com.Spring.Company">
        <property name="Car" ref="CarBean" />
        <property name="Person" ref="PersonBean" />
    </bean>
</beans>

更改Company类如下:

package com.Spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Company {

    private Car car;
    private Person person;

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        Company company = (Company) context.getBean("CompanyBean");
        System.out.println(company.car.toString());
        System.out.println(company.person.toString());
    }

}

即可完成需求。、

使用@Autowired的情况

Spring 2.5引入了@Autowired注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。通过@Autowired的使用来消除set,get方法。

(就是为了少写配置文件的代码)

修改Beans.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config />

    <bean id="CarBean" class="com.Spring.Car">
        <property name="name" value="Car_A" />
        <property name="code" value="10" />
    </bean>
    <bean id="PersonBean" class="com.Spring.Person">
        <property name="name" value="Person_A" />
        <property name="age" value="20" />
    </bean>
    <bean id="CompanyBean" class="com.Spring.Company">
    </bean>
</beans>

修改Company.java如下:

package com.Spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Company {
    @Autowired
    private Car car;
    @Autowired
    private Person person;

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        Company company = (Company) context.getBean("CompanyBean");
        System.out.println(company.car.toString());
        System.out.println(company.person.toString());
    }

}

即可完成规定输出。这里需要注意@Autowired有两种查bean的方式:
首先bytype即按类型查找有没有符合的Bean,如果有且唯一即返回。
如果有相同type的则byname即查找符合的name,如果有则返回。
当然也可以使用@Qualifier进行指定byName方式注入

总结

@Autowired可以减少配置文件的代码,而且可以拥有更低的耦合度。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring Mvc那点事---(7)Spring Mvc @Autowired注解

Spring中的类中定义的变量,方法,构造函数通过标注@Autowired注解可以从配置文件中找到相应的bean,完成自动装配的工作。默认情况下,@Autowired是按类型来匹配相应的bean,也可...
  • zx13525079024
  • zx13525079024
  • 2016年05月17日 21:54
  • 949

spring的Autowired,Qualifier注解介绍以及自动装配

@Autowired默认按类型装配,它有一个required属性,默认为true,意思是这个字段或属性必须被装配,否则会报字段或属性装配异常,如果required设为false则可以将此字段或属性设置...
  • xzf19901108
  • xzf19901108
  • 2012年08月04日 16:57
  • 4714

Spring @Autowired和构造函数的顺序

最近写代码需要在构造函数中调用一个本class的函数,而这个函数中用到了本class的@Autowired的变量。 于是觉得可能会出错。因为@Autowired一定要等本类构造完成后,才能从外部引用...
  • zzpzheng
  • zzpzheng
  • 2017年09月07日 21:00
  • 602

Spring @Autowired注解与自动装配

遇到的问题@Autowired @Qualifier("cipShopOwnerServiceImpl") bean name ShopOwnerService cipShopOwnerServi...
  • mccand1234
  • mccand1234
  • 2016年09月08日 16:40
  • 5771

Spring AOP 和@Autowired 的问题

今天遇到两个问题。顺便做个笔记。以后遇到相同问题可以快速定位。 1、Spring AOP  报错 org.springframework.aop.framework.AopConfigExceptio...
  • sinat_18433095
  • sinat_18433095
  • 2016年09月17日 12:45
  • 303

Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

http://moshowgame.iteye.com/blog/1607718 @Autowired自动装配 上面的例子我们用的都是手动装配的,如果DAO-Service一多那就很麻烦了,那么我...
  • caolaosanahnu
  • caolaosanahnu
  • 2013年12月16日 17:50
  • 1067

Spring入门——Bean装配之Autowired注解

@Required @Required注解适用于bean属性的setter方法 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在Bean定义或通过自动装配一个明确的属性值,@req...
  • wenwen360360
  • wenwen360360
  • 2017年02月16日 14:55
  • 2922

Spring @Autowired 注入集合类型的问题

从spring 2.5版本开始,spring提供了基于注解方式的依赖注入。在容器的xml配置文件中,添加如下的配置 即可扫描com.example包及其子包下所有使用特定注解注明的类,创建他们的实...
  • qianlibie
  • qianlibie
  • 2015年03月05日 10:54
  • 3130

spring结合mybatis 用@autowired 方式调用mybatis接口

spring跟mybatis结合后,如果在service层想要diaoyon
  • newwoyaoxiazai
  • newwoyaoxiazai
  • 2014年11月21日 11:08
  • 3285

Spring自动装配@Autowired的三种方式

转自:https://ahaochan.github.io/Java/JavaWeb/Spring/Spring%E8%87%AA%E5%8A%A8%E8%A3%85%E9%85%8D@Autowir...
  • jkguang
  • jkguang
  • 2017年06月29日 08:57
  • 2437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Spring学习笔记]@Autowired
举报原因:
原因补充:

(最多只允许输入30个字)