一、Spring 中用于管理bean的注解分为四大类:
1.用于创建对象
@Component @Controller @Service @Repository
① @Componet / @Componet(value="")注解:
作用:把资源让 spring 来管理,相当于在 xml 中配置一个 bean。
属性:value 指定 bean 的 id 。如果不指定 value 属性,默认为 bean 的 id 是当前类 类名,首字母小写
② @Controller @Service @Repository
它们三个注解都是针对一个的衍生注解,它们的作用及属性都是一模一样的。
它们不同的地方在于各自提供了明确的语义化:
@Controller : 一般用于表现层的注解。
@Service :一般用于业务层的注解。
@Repository :一般用于持久层的注解
2.用于注入数据
@Value @Autowired @Qualifier @Resource
相当于
① @Value
作用:注入基本数据类型和 String 类型数据的
属性:用于指定值
@Value("张三")
private String name;
② @Autowired
作用: 自动按照类型注入,当使用注解注入属性时,set方法可以省略,它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器中查找,找到了也可以注入成功。找不到就报错。
③ @Qualifier
作用: 在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。 它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
属性:value 指定bean的id
public interface UserService {
public User getUserById(integer id);
}
@Service("userServiceImpl")
public class UserServiceImpl implements UserService {
public User getUserById(integer id) {
return new User();
}
}
@Service("userServiceImpl1")
public class UserServiceImpl1 implements UserService {
public User getUserById(integer id) {
return new User();
}
}
@Controller
@RequestMapping("/user")
public class UserInfoControl {
@Autowired
@Qualifier("userServiceImpl1")
UserService userService;
@RequestMapping("/showUserInfo")
public void showUserInfo(HttpServletRequest request, HttpServletResponse response, User user) {
//..........
}
}
④ @Resource
作用:直接按照 Bean 的 id 注入。它也只能注入其他Bean类型。
属性:name 指定 bean 的值
3.用于改变作用域范围的
① @Scope
作用:指定bean的作用范围
属性:指定范围的值,取值:singleton prototype request session globalsession
在该类上加 @Scope 注解,指定该类是多例的,默认是单例的。给该类显示指定一个无参构造方法,方便测试
4.和生命周期相关的
相当于:
① @PostConstruct注解
@PostConstruct 加在方法上,指定bean对象创建好之后,调用该方法初始化对象,类似于 xml 的 init-method 方法。修改UserServiceImpl类,在其中增加一个init方法,在该方法上指定 @PostConstruct注解
public class UserServiceImpl implements UserService(){
@Autowired
private UserDao userDao;
@PostConstruct
public void init(){
System.out.println("调用了init方法......");
}
@Override
public void saveUser(){
System.out.println("业务层:用户保存...." + name);
userDao.save();
}
}
② @PreDestory 注解
@PreDestory 加在方法上,指定bean销毁之前,调用该方法,类似于xml的 destory-method 方法。修改UserServiceImpl类,在该类中增加一个destroy方法,在该方法上加 @PreDestroy注解
public class UserServiceImpl implements UserService(){
@Autowired
private UserDao userDao;
@PostConstruct
public void init(){
System.out.println("调用了init方法......");
}
@Override
public void saveUser(){
System.out.println("业务层:用户保存...." + name);
userDao.save();
}
@PreDestory
public void destory(){
System.out.println("调用了destory方法......");
}
}
注意:要看到 @PreDestory 的效果,需要调用 ClassPathXmlApplicationContext.close方法,同时 scope的值要是 singleton。所以,还得修改以下代码,显示关闭 ioc 容器
@Test
public void test(){
//创建ioc容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1 = (UserService) ac.getBean("userService");
UserService userService2 = (UserService) ac.getBean("userService");
System.out.println(userService1 == userService2);
((ClassPathXmlApplicationContext)ac).close();
}
5.新注解说明
① @Configuration
作用:用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。
属性:value:用于指定配置类的字节码
② @ComponentScan
作用:用于指定spring在初始化容器时要扫描的包。
作用和在spring的xml配置文件中的:
属性:basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
③ @Bean
作用:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。
属性:name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)
④ @PropertySource
作用:用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
属性:value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath。
⑤ @Import
作用: 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration注解。当然,写上也没问题。
属性:value[]:用于指定其他配置类的字节码。
⑥ @ContextConfiguration
@ContextConfiguration 注解可以通过 classes 属性指定加载哪个配置类
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = "指定加载哪个配置类")
public class Test {
@Autowired
private UserService userService;
@Test
public void test1(){
..........
}
}
常用注解小结:
与创建 bean 对象相关:
@Component @Controller @Service @Repository
与注入值相关:
@Value @Autowired(重点) @Qualifier @Resource
与范围相关:
@Scope
与生命周期相关:
@PostConstruct @PreDestroy