Spring03:注解的使用

利用注解的方式注入属性,大大减少了代码量,使代码看起来更加的简洁,但是也对我们代码的开发者提出了更为严格的要求,要求我们了解注解的作用,深层次了解注解给我们省去哪些代码量。
在使用注解开发之前,先要引入context的头文件,另一个是要开启注解的支持,:

<!--头文件-->
xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!--开启注解支持-->
<context:annotation-config/>

<context:annotation-config作用:

  1. 进行注解驱动注册,从而使注解生效
  2. 如果没有扫描包,就需要进行手动配置bean
  3. 如果不加注解驱动,则注入的值为null

注解分类:

一.@Autowired和@Qualifier

  1. @Autowired需要导入spring-aop的包
  2. @Autowired是按类型自动转配的,不是按id匹配
  3. 配合@Qualifier则可以根据byName的方式自动装配
  4. @Qualifier不能单独使用

程序演示
1.编写实体类,(注意无set方法),并且使用@Autowired注解

public class Cat {
    public void shout(){
        System.out.println("喵喵喵");
    }
}
public class Dog {
    public void shout(){
        System.out.println("汪汪汪");
    }
}
public class People {
    private String name;
    @Autowired
    @Qualifier(value = "cat333")
    private Cat cats;
    @Autowired
    @Qualifier(value ="dog333")
    private Dog dogs;

    public String getName() {
        return name;
    }

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

    public Cat getCats() {
        return cats;
    }

    public void setCats(Cat cats) {
        this.cats = cats;
    }

    public Dog getDogs() {
        return dogs;
    }

    public void setDogs(Dog dogs) {
        this.dogs = dogs;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", cats=" + cats +
                ", dogs=" + dogs +
                '}';
    }
}

2.配置beans.xml文件:
@Qualifier注解的内容应该与bean中配置的id内容相一致或者bean中id应该与类中对象名称保持一致,两者可以配合使用。

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

       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
                        https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
                        https://www.springframework.org/schema/aop/spring-aop.xsd">
    <context:annotation-config/>
    <bean id="cat" class="Cat"/>
    
    <!--配置文件修改内容,保证类型存在对象,且名字不为类的默认名字-->
    <bean id="cat333" class="Cat"/>
    
    <bean id="dog" class="Dog"/>
    
    <!--配置文件修改内容,保证类型存在对象,且名字不为类的默认名字-->
    <bean id="dog333" class="Dog"/>
    <bean id="person" class="People"/>

</beans>

3.测试:

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("beams.xml");
        People people =  context.getBean("person",People.class);
        people.getCats().shout();
        people.getDogs().shout();
    }
}

结果:
  上述结果表示,即使配置bean中的id与类对象不一致,同样可以通过注解@Qualifier进行自动匹配,但是前提是开启注解支持。

二:@Resource

  1. @Resource如有指定的name属性,先按该属性进行byName方式进行装配
  2. 其次再进行默认的byName方式进行装配
  3. 如过以上都不成功,则按byType的方式自动装配
  4. 都不成功的话,则报异常。
    程序演示:
    1.实体类:
public class User {
   //如果允许对象为null,设置required = false,默认为true
   @Resource(name = "cat2")
   private Cat cat;
   @Resource
   private Dog dog;
   private String str;
}

2.配置xml文件

<bean id="dog" class="Dog"/>
<bean id="cat1" class="Cat"/>
<bean id="cat2" class="Cat"/>

<bean id="user" class="User"/>

则结果ok,与上述结果一致。

做出以下相应改变:
配置文件中,删掉cat2的bean:

<bean id="dog" class="Dog"/>
<bean id="cat1" class="Cat"/>

实体类只保留注解,不设置value的值:

@Resource
private Cat cat;
@Resource
private Dog dog;

测试发现,结果不变,与上述一致。则表示先进性byName查找,若失败,则进行byType查找,而@Autowired先是byType查找。

三:Bean的实现:

1.配置扫描特定包下的注解:

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

2.在指定包下编写类,增加注解
@Conponent:将这个类标注成Spring的一个组件,放到容器中。

@Conponent("user")
//相当于xml文件中<bean id="user" class="特定类"/>
public class User(){
private String name="王军";
}

若没有提供set方法,使用@value(“值”)一样达到效果:

@Conponent("user")
public class User(){

//相当于配置文件中<property name="name" value="王军"/>
@Value("王军")
private String name;
}

若提供了set方法,则将注解使用在set方法处就行。

@Bean:
新建一个config配置包,编写一个MyConfig配置类:

@Configuration  //代表这是一个配置类
public class MyConfig {
   @Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
   public Dog dog(){
       return new Dog();
  }
}

四:三个衍生注解

1.@Controller:web层
2.@Service:service层
3.@Repository:dao层
在各层写上这些注解代表类将交由Spring统一管理装配。

总结:

xml与注解比较:
1.xml适用于任何场景,结构清晰,维护方便。
2.注解只能在自己提供的类上使用,开发简单方便。

xml与注解同时使用是目前最好的开发方式,一方面利用xml文件管理bean,另一方面,利用注解完成类中属性的注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值