Spring框架的注解使用
1. 入门案例
1.1 JavaBean
//People类
@Data
public class People {
@Autowired//Autowired默认按照bean的类型进行自动装配 byType,若类型相同再根据name进行装配
private Cat cat;
@Resource(name = "dog")
private Dog dog;
@Value("张三")
private String name;
}
//Dog类
public class Dog {
public void shout(){
System.out.println("汪~");
}
}
//Cat类
public class Cat {
public void shout(){
System.out.println("喵~");
}
}
1.2 SpringIOC配置文件
<?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.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 对当前目录的所有包进行注解扫描 -->
<context:component-scan base-package="org.westos"/>
<bean id="cat" class="org.westos.pojo.Cat"/>
<bean id="dog" class="org.westos.pojo.Dog"/>
<bean class="org.westos.pojo.People" id="people"/>
</beans>
1.3 测试类
public class MyTest {
@Test
public void run0() throws Throwable {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = context.getBean("people", People.class);
System.out.println(people.getName());
people.getDog().shout();
people.getCat().shout();
}
}
1.4 测试结果
2. 常用注解总结
-
@Component
作用:把资源让spring来管理,相当于在xml中配置一个bean。
属性:value:指定bean的id。如果不指定value属性,默认bean的id是当前类的类名。首字母小写。
-
@Controller、@Service、@Repository
这三个注解都是Companent的衍生注解,其作用属性都一模一样。
Controller用于表现层
Service用于业务层
Repository用于持久层
-
@Autowired
作用:默认先按照bean的类型进行自动装配 (byType),若类型相同再根据名称(byName)进行装配,但这时的对象名称必须与bean标签的id保持一致,不然就会报错。
-
@Qualifier
作用:在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。
属性:value:指定bean的id。
-
@Resource
作用:若有指定的name属性,则会先按照该属性进行装配。其次通过默认的byName方式进行装配,如果以上都不成功,则按照byType的方式进行自动装配。
属性:指定bean的id
-
@Value
作用:只能注入基本数据类型和String类型数据。
属性:用于指定值
-
@Scope
作用:指定bean的作用范围
属性:指定范围的值,包括(singleton、prototype、request、session、globalsession)
-
@Configuration
作用:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。
属性:value:用于指定配置类的字节码
-
@ComponentScan
作用:用于指定spring在初始化容器时要扫描的包。
属性:basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
-
@Bean
作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。
属性:name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id),若没有设置id,在对象名称默认为方法名。
-
@PropertySource
作用:用于加载.properties文件中的配置。
属性:value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath:
-
@Import
作用:用于导入其他配置类。
属性:value[]:用于指定其他配置类的字节码。
-
@RunWith
作用:替换原有运行器,是Spring整合Junit特有的。
属性:默认value:使用 SpringJUnit4ClassRunner.class
-
@ContextConfiguration
作用:加载指定 spring 配置文件的位置
属性:
- locations:加载配置文件。若在类路径下,需要写上 classpath:
- classes:加载配置类。为指定配置类的字节码
3. 常见问题
- @Autowired和@Resource的区别
- @Autowired和@Resource都可以装配bean,都可以写在字段上,或写在set方法上
- @Autowired默认按照类型装配,默认要求对象必须存在,如果允许为null,可以设置它的required属性为false
- @Resource默认按照名称进行装配,名称通过name属性进行指定。当注解写在字段上时,默认取字段名进行名称查找;如果注解写在set方法上默认取属性名进行装配。当找不到与名称相匹配的bean时,才按照类型进行装配,需要注意的是:一旦name属性确定,就只会按照名称进行装配。
- @Autowired是先进行类型装配。@Resource是先进行name属性装配。
- XML开发与注解开发的优劣
- XML适用于任何场景,结构清晰,便于维护
- 注解开发时,不是自己定义的类使用不了,但是开发简单便捷
按照类型进行装配,需要注意的是:一旦name属性确定,就只会按照名称进行装配。 - Spring框架最佳的开发模式:xml 管理bean,使用注解进行属性注入(推荐)。