Spring注解IOC/DI(4)

时间:2023-12-17 09:38:32

2019-03-08/11:10:17

演示:使用注解的方式完成注入对象中的效果

注解参考链接:https://www.cnblogs.com/szlbm/p/5512931.html

Spring中id与name的区别:https://blog.csdn.net/qq_22063697/article/details/51912386

1.修改applicationContext.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:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx" 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/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

     <context:annotation-config/>   //告诉Spring用注解的方式进行配置
     <bean name="c" class="pojo.Category">
         <property name="name" value="category 1" />
     </bean>
     <bean name="p" class="pojo.Product">
         <property name="name" value="product1" />
 <!--         <property name="category" ref="c" /> -->   //用注解的方式替代
     </bean>

 </beans>

2.在Product.java的category属性前加上@Autowired注解

  @Autowired:顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。例子中统一不去掉get和set.

 package pojo;

 import org.springframework.beans.factory.annotation.Autowired;

 public class Product {

     private int id;
     private String name;
     @Autowired
     private Category category;

     public int getId() {
         return id;
     }

     public void setId(int id) {
         this.id = id;
     }

     public String getName() {
         return name;
     }

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

     public Category getCategory() {
         return category;
     }

     public void setCategory(Category category) {
         this.category = category;
     }
 }

Product.java

3.测试代码

 package test;

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

 import pojo.Product;

 public class TestSpring {

     public static void main(String[] args) {
         ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
         Product p = (Product) context.getBean("p");
         System.out.println(p.getName());
         System.out.println(p.getCategory().getName());
     }
 }

TestSpring

4.@Autowired的位置

除了前面的在属性前加上@Autowired这种方式外,也可以在setCategory方法前加上@Autowired,这样来达到相同的效果

 package pojo;

 import org.springframework.beans.factory.annotation.Autowired;

 public class Product {

     private int id;
     private String name;

     private Category category;

     public int getId() {
         return id;
     }

     public void setId(int id) {
         this.id = id;
     }

     public String getName() {
         return name;
     }

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

     public Category getCategory() {
         return category;
     }
     @Autowired
     public void setCategory(Category category) {
         this.category = category;
     }
 }

5.@Resource

@Resource注解与@Autowired它们作用非常相似,这个就简单说了,例子过后点明一下@Resource和@Autowired的区别。先看一下@Resource,直接写Product.java了:

 package pojo;

 import javax.annotation.Resource;

 public class Product {

     private int id;
     private String name;
     @Resource(name="c")
     private Category category;

     public int getId() {
         return id;
     }

     public void setId(int id) {
         this.id = id;
     }

     public String getName() {
         return name;
     }

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

     public Category getCategory() {
         return category;
     }

     public void setCategory(Category category) {
         this.category = category;
     }
 }

Product.java

6.@Resource与@Autowired 

@Resource的装配顺序:

1、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

2、指定了name或者type则根据指定的类型去匹配bean

3、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired和@Resource两个注解的区别:

1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

7.对Bean的注解  @Component

上面这个例子,还可以继续简化,因为spring的配置文件里面还有16行~20行两个个bean,下一步的简化是把这两个bean也给去掉,使得spring配置文件里面只有一个自动扫描的标签,增强Java代码的内聚性并进一步减少配置文件。

要继续简化,可以使用@Componet。先看一下配置文件,当然是全部删除了:

<context:component-scan base-package="pojo"/>        其作用时告诉Spring,bean都放在pojo这个包下面

 <?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:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx" 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/aop
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

     <context:component-scan base-package="pojo"/>

 </beans>

8.@Component

  Product类加上@Component注解,即表明此类是bean       @Autowired注入Category对象不能取消

  Category类加上@Component注解,即表明此类是bean

  另外,因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了。

  

 package pojo;

 import javax.annotation.Resource;

 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

 @Component("p")
 public class Product {

     private int id;
     private String name="product 1";

     @Autowired
     private Category category;

     public int getId() {
         return id;
     }

     public void setId(int id) {
         this.id = id;
     }

     public String getName() {
         return name;
     }

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

     public Category getCategory() {
         return category;
     }

     public void setCategory(Category category) {
         this.category = category;
     }
 }

Product.java

 package pojo;

 import org.springframework.stereotype.Component;

 @Component("c")
 public class Category {

     private int id;
     private String name="category 1";

     public int getId() {
         return id;
     }
     public void setId(int id) {
         this.id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }

 }

Category.java

 package test;

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

 import pojo.Product;

 public class TestSpring {

     public static void main(String[] args) {
         ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
         Product p = (Product) context.getBean("p");
         System.out.println(p.getName());
         System.out.println(p.getCategory().getName());
     }
 }

TestSpring.java