Spring_注解开发

@Autowired自动装配

在使用注解前一定先在spring中开启注解支持

<!--    开启注解支持-->
    <context:annotation-config/>

实体类

public class Cat {
    public void shout(){
        System.out.println("miao~");
    }
}

public class Dog {
    public void shout(){
        System.out.println("wang~");
    }
}
public class People {
    private Cat cat;
    private Dog dog;
    private String name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}
    <bean id="cat" class="com.fan.pojo.Cat"/>
    <bean id="dog" class="com.fan.pojo.Dog"/>
    <bean id="people" class="com.fan.pojo.People">
        <property name="name" value="小凡"/>
        <property name="dog" ref="dog"/>
        <property name="cat" ref="cat"/>
    </bean>

不使用注解的情况下,我们如果要写这样有个例子,对于属性,dog,cat我们需要自己手动进行注入

    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        People people = context.getBean("people", People.class);
        people.getCat().shout();
        people.getDog().shout();
    }

再说注解之前,我们先说bean里的autowire属性,它的值有byNamebyType,说一下它们的区别

  • byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的bean id/ setDog dog
  • byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean class/ com.fan.pojo.Dog dog (此时,id也可以不写),得保证class唯一

此时xml中可以这样写

    <bean id="cat" class="com.fan.pojo.Cat"/>
    <bean id="dog" class="com.fan.pojo.Dog"/>
    <bean id="people" class="com.fan.pojo.People" autowire="byType">
        <property name="name" value="小凡"/>
    </bean>

或者

    <bean id="cat" class="com.fan.pojo.Cat"/>
    <bean id="dog" class="com.fan.pojo.Dog"/>
    <bean id="people" class="com.fan.pojo.People" autowire="byName">
        <property name="name" value="小凡"/>
    </bean>

举个例子,如果这样写

    <bean id="cat" class="com.fan.pojo.Cat"/>
    <bean id="dog11" class="com.fan.pojo.Dog"/>
    <bean id="people" class="com.fan.pojo.People" autowire="byName">
        <property name="name" value="小凡"/>
    </bean>

就会报错喽

现在再来说@Autowired,当给属性加个这个注解时,它就默认byType自动装配,当匹配到多个相同类型时,使用ByName进行装配
顺便再说一下@Qualifier,和@Autowired可以一起使用,@Autowired就会找与@Qualifier里value值相同的bean去进行装配
所以,实体类就可以这样写

public class People {
    @Autowired
    @Qualifier(value = "cat")
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog11")
    private Dog dog;
    private String name;

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}
<!--    开启注解支持-->
    <context:annotation-config/>

    <bean id="cat" class="com.fan.pojo.Cat"/>
    <bean id="dog11" class="com.fan.pojo.Dog"/>
    <bean id="people" class="com.fan.pojo.People">
        <property name="name" value="小凡"/>
    </bean>

测试一下,运行OK

使用注解开发

简单的框架结构

@Controller
public class UserController {
}
@Repository
public class UserDao {
}
@Service
public class UserService {
}
@Component
@Scope("singleton")
public class User {
    @Value("fan")
    public String name;
}

讲一个@Controller@Repository@Component@Service这四个注解
其实它们的作用都是一样的,表示这个类被spring接管,等价于<bean id="xx" class="xxx"/>
只不过是在不同层,使用注解的名称不一样,dao层使用@Repository,service层使用@Service,controller层使用@Controller,pojo包使用@Component
@Scope("singleton"),声明作用域,singleton是单例模式
@Value("fan") 相当于 <property name="name" value="fan">,给属性name注入值

<?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">

<!--    指定要扫描的包,这个包下的注解就会生效-->
    <context:component-scan base-package="com.fan"/>
    <context:annotation-config/>
</beans>
posted @ 2023-01-06 13:14  Fannaa  阅读(23)  评论(0)    收藏  举报