SpringAnnotation注解之@PreDestroy,@PostConstruct,@Scope

@Scope的使用很简单,直接在类上加上就行

@PostConstruct:相当于xml配置方式的init-method方法

@PreDestroy:相当于xml配置方式的destroy-method方法

例如:userService


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package com.fz.annotation.service;

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Component;

import com.fz.annotation.dao.UserDao;

import com.fz.xml.entity.User;

@Service("userService")

@Scope("prototype")

public class UserService {

    private UserDao userDao;

    public void userAdd(){

        User user = new User();

        user.setUsername("zhangsan");

        user.setPassword("zhangsan");

        userDao.userAdd(user);

    }

    public UserDao getUserDao() {

        return userDao;

    }

    @Resource(name="userDaoImpl")

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

    

    @PostConstruct

    public void init(){

        System.out.println("init...");

    }

    @PreDestroy

    public void destroy(){

        System.out.println("destroy...");

    }

}

applicationContext.xml配置很简单:


1

2

3

4

5

6

7

8

9

10

11

12

<?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-3.0.xsd

           http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config/>

    <context:component-scan base-package="com.fz.annotation"></context:component-scan>

    

</beans>

测试代码:


1

2

3

4

5

6

7

8

9

@Test

public void getProperties(){

    ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext_annotation.xml");

    UserService userService = (UserService) ctx.getBean("userService");

    UserService userService1 = (UserService) ctx.getBean("userService");

    userService.userAdd();

    System.out.println(userService == userService1);

    ctx.destroy();

}

结果如下:

可以看出init还是执行了两次,两个对象也不是同一个对象,但是destroy同样还是不执行了。。。。

来自为知笔记(Wiz)

时间: 2024-10-09 11:56:42

SpringAnnotation注解之@PreDestroy,@PostConstruct,@Scope的相关文章

Spring中Bean初始化及销毁方法(InitializingBean接口、DisposableBean接口、@PostConstruct注解、@PreDestroy注解、以及init-method方法和destroy-method方法)

一. 在Spring中Bean的初始化后以及销毁前的回调方式有: init-method:是指创建bean时调用的方法,注意,不是创建bean的方法. destroy-method:是指销毁bean时调用的方法,同样,不是销毁bean的方法. @PostConstruct注解:在bean实例化和注入后,进行初始化 @PreDestroy:在bean销毁前回调 InitializingBean接口: 查看InitializingBean接口的源码可以发现,只有一个方法,需要pojo继承Initia

SpringAnnotation注解之@Component,@Repository,@Service,@Controller

@Component:组件,表示此写上了此注解的bean,作为一个组件存在于容器中.这样的话别的地方就可以使用@Resource这个注解来把这个组件作为一个资源来使用了.初始化bean的名字为类名首字母小写 与@Component注解功能相同的注解有:@Repository,@Service,@Controller,@Component ,默认情况下Spring认为这4个注解会被认为是一个组件. @Repository:数据层,一般放在Dao接口的实现类上 @Service:服务层,一般放在se

SpringAnnotation注解之@Autowired

@Autowired:自动装配,不用在bean里写<property>属性来指定所依赖的属性 1 2 3 4 @Autowired public void setUserDao(UserDao userDao) {     this.userDao = userDao; } Autowired:表示spring会在容器里找跟setUserDao(UserDao userDao)这里面的参数相同类型的bean,然后给注入进来. 例如:原来用XML方式的写法 1 2 3 4 5 <bean

SpringAnnotation注解之@Resource

@Resource:同样也是注入,默认是按byName,byName找不到的话按byType 1 2 3 4 @Resource public void setUserDao(UserDao userDao) {     this.userDao = userDao; } xml文件里,没有一个名字为userDao的bean 1 2 3 4 5 6 <bean id="userDaoImpl" class="com.fz.annotation.dao.impl.User

Spring中的scope配置和@Scope注解

Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围.在 Spring IoC 容器中具有以下几种作用域:基本作用域(singleton.prototype),Web 作用域(reqeust.session.globalsession),自定义作用域. 1.Spring 的作用域在装配 Bean 时就必须在配置文件中指明,配置方式如下(以 xml 配置文件为例): <!-- 具体的作用域需要在 scope 属性中定义 -->

Springboot注解 - @Lazy和@Scope

springboot注解说明: 默认情况下 spring 容器中都是单实例. @Lazy注解 value=false:默认在容器启动的时候创建对象 value=true:懒加载:容器启动不创建对象.第一次使用(获取)Bean创建对象,并初始化 @Scope注解 prototype:多例.IOC容器启动并不会去调用方法创建对象放在容器中.每次获取的时候才会调用方法创建对象: singleton:单例.IOC容器启动会调用方法创建对象放到ioc容器中. 以后每次获取是直接从容器(map.get())

Spring 注解详解03

@Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @resource @PostConstruct @PreDestroy @repository @component (不推荐使用) @scope @SessionAttributes @InitBinder @Required @qualifier // @Controller 例如 @Con

Spring JSR-250注解

Spring JSR-250注解 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名.类型等信息,如果关系表字段和 PO 属性名.类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取. 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果

Spring常用注解总结

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低.2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率.为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密