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属性,它的值有byName和byType,说一下它们的区别
- 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>

浙公网安备 33010602011771号