@(Spring)[Spring, ioc, 注解]
Spring IOC注解开发Spring的IOC的注解使用步骤创建项目引入jar包引入配置文件创建相关包和类将类的控制权交给Spring容器编写测试依赖注入Spring的IOC注解的详解Bean定义注解Bean依赖注入注解Bean的作用范围的注解Bean的生命周期注解Spring的IOC的xml方式和注解方式比较XML和注解的比较contextcomponet-scan和contextannotation-config的区别
如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。
PS:如果不知道怎么配置Spring和junit单元测试集成,可以参考之前写的博客《Spring集成单元测试》
原来需要使用XML配置的方式将id和类绑定,现在不需要这样做了只需要在类上添加注解即可。
@Component
:组件 @Controller
:修饰web层类@Service
:修饰业务层类@Repository
:修饰持久层类@Component
是Spring提供的通用的组件注解,可以通过在类上使用该注解,将对应的类标记为Spring Bean,使用此功能需要在Spring配置文件中,开启组件扫描,<context:component-scan base-package="包名"/>
。
@Component
和@Component("name")
的区别在于,前者只能通过Spring的按类型注入依赖,后者还能使用按名注入依赖。
@Controller
、@Service
和@Repository
这三个注解和@Component
的功能在目前的4.x.x版本都是一样的,只是表明它是一个组件。不过通过在不同层使用相对应的注解,可以使注解更具有意义。在以后的版本中,Spring可能提供对这三个注解不同的增强。
如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringIOCAnnotationTest { // @Value("Switch") private String name; @Value("Switch") public void setName(String name) { this.name = name; } @Test public void test2() { System.out.println(name); }}PS:如果同时在属性和set方法上添加了注解,那么set方法上的注解将会覆盖属性上的。
普通类型的属性@Value
:注入普通类型属性@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringIOCAnnotationTest { @Value("Switch") private String name; @Test public void test2() { System.out.println(name); }}对象类型的属性 @Resource
:注入对象类型@Autowired
:注入对象类型,默认按照类型注入。结合@Qualifier
注解完成按名称的注入。 @Qualifier
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringIOCAnnotationTest { // 按bean类型注入 // @Resource // 按名注入,需要组件设置名称 // @Resource(name = "userService") // 和上面功能一样,按名注入 @Qualifier("userService") @Autowired private UserService userService; @Test public void test1() { userService.save(); }}@Scope
:在类上添加的,控制类生成的时候采用单例还是多例。 取值: singleton
:单例prototype
:多例request
:request域,需要在web环境session
:session域,需要在web环境application
: context域,需要在web环境globalsession
集群环境的session域,需要在web环境PS:可以到WebApplicationContext
接口和ConfigurableBeanFactory
类中找到@Scope
的取值。
@PostConstruct
:相当于init-method@PreDestroy
:相当于destroy-method@Service("userService")public class UserServiceImpl implements UserService { @Override public void save() { System.out.println("保存用户"); } @PostConstruct public void init() { System.out.println("用户初始化"); } @PreDestroy public void destory() { System.out.println("注销用户"); }}通过<context:annotation-config>
的注释可以看出它的作用是激活 @Required
、@Autowired
、@PostConstruct
、@PreDestroy
、@Resource
等注解。
通过<context:component-scan base-package="xx"/>
的注释可以看出它除了激活了<context:annotation-config>
中所有的注解,同时还激活了@Component
、@Repository
、@Service
、@Controller
、 @RestController
、@ControllerAdvice
、@Configuration
这些注解。
附上不错的关于 <context:component-scan>
使用的博文, context:component-scan使用说明
新闻热点
疑难解答