九零后大叔
技术人的点点滴滴

beanfactory篇-(五)init-method属性和InitializingBean接口的使用

回顾:通过前面的章节的了解,我们又了解了FactoryBean接口的使用,当我们想自己手动创建一个bean并且自己初始化这个bean的一些属性的时候,我们可以使用FactoryBean来实现。通过前面的章节学习,我们基本上知道了bean的几种实例化(也就是创建方式):第一种是xml配置spring创建方式,第二种是@Service、@Controller、@Conponent等注解后spring创建的方式,第三种就是通过FactoryBean接口方式,通过开发者自己创建一个bean对象。了解完成了bean的实例化方式,本章节我们了解一下bean的几种初始化的方式。注意:实例化是创建bean,而初始化是初始化bean,两者不要搞混了,本章节我们将了解两种初始化bean的方式。


1. init-method属性和InitializingBean接口的基本介绍

一、init-method属性:用于指定一个类的一个方法,spring在创建该类的bean之后,会马上调用该方法用于初始该bean对象。

二、InitializingBean接口:作用同上,一个类实现该接口后,spring在创建该类的bean之后,会马上调用afterPropertiesSet方法,开发者可以在该方法内写代码初始化该bean对象。


2. init-method属性基本使用

第一步:创建一个User类如下:

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class User implements Serializable {

    private static final long serialVersionUID = 4800166777883697833L;

    private Long id;
    private String name;
    private String identity;
    private String mobile;
    private String bankcard;
    private Integer age;
    private Integer gender;

}

第二步:创建一个接口和接口实现类如下:

public interface UserService {

    User findUserById(Long id);

}

public class UserServiceImpl implements UserService {

    public String version;
    public String serviceName;

    public void initUserService() {
        version = "V1.0.0";
        serviceName = "用户服务";
    }

    @Override
    public User findUserById(Long id) {

        User user = new User();
        user.setId(id);
        user.setName("张山");
        user.setIdentity("张山");
        user.setBankcard("36457736355363");
        user.setMobile("16752652625");
        user.setGender(2);
        user.setAge(18);

        System.out.println("version: " + version);
        System.out.println("serviceName: " + serviceName);

        return user;
    }

}

第三步:配置applicationContext.xml文件内容:

<bean id="userService" name="userService" class="com.minesoft.tutorial.service.UserServiceImpl"
      scope="singleton"
      autowire="byType"
      abstract="false"
      lazy-init="true"
      init-method="initUserService"
/>

第四步:最后我们运行下面的代码

    ClassPathXmlApplicationContext cac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    UserService userService = cac.getBean(UserService.class);
    User user = userService.findUserById(100L);
    System.out.println(JSONObject.toJSONString(user));

我们能看到控制台会输出“version: V1.0.0,serviceName: 用户服务”字符串,说明我们的initUserService被spring调用了,然后成功的初始化了UserServiceImpl这个bean。


3. InitializingBean接口的基本使用

第一步:创建一个User类如下:

@Data
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class User implements Serializable {

    private static final long serialVersionUID = 4800166777883697833L;

    private Long id;
    private String name;
    private String identity;
    private String mobile;
    private String bankcard;
    private Integer age;
    private Integer gender;

}

第二步:创建一个接口和接口实现类如下:

public interface UserService {

    User findUserById(Long id);

}

@Service
public class UserServiceImpl implements UserService, InitializingBean {

    private Map<Integer, String> blackListMap = new HashMap<>();

    @Override
    public void afterPropertiesSet() throws Exception {

        System.out.println("Execute afterPropertiesSet method.");

        //初始化一个id与姓名的map用于后面的业务处理
        blackListMap.put(10001, "李云");
        blackListMap.put(10002, "韩宇");
        blackListMap.put(10003, "刘武");

    }

    @Override
    public User findUserById(Long id) {

        User user = new User();
        user.setId(id);
        user.setName("张山");
        user.setIdentity("张山");
        user.setBankcard("36457736355363");
        user.setMobile("16752652625");
        user.setGender(2);
        user.setAge(18);

        return user;
    }

}

第三步:配置applicationContext.xml文件内容:

<context:component-scan base-package="com.minesoft.tutorial" />

第四步:最后我们运行下面的代码

XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService userService = beanFactory.getBean(UserService.class);
User user = userService.findUserById(100L);
System.out.println(JSONObject.toJSONString(user));

运行完上面的代码,我们会发现在执行System.out.println(JSONObject.toJSONString(user));代码前,控制台有输出如下的语句“Execute afterPropertiesSet method.”,说明afterPropertiesSet这个方法在我们创建bean的时候会被调用,用于完成我们的bean的个性出初始化的处理。另外完成这个方法的执行后我们的UserServiceImpl类的bean持有了一个Map对象,可以用于我们后续的业务处理。

总结:无论是init-method属性还是InitializingBean接口,都是spring框架给开发者一个灵活初始化自己的业务bean的扩展机制。这个两种初始化bean的使用方式比较简单,再次就不多做赘述。


更多知识请关注公众号

赞(0) 赏一下
未经允许不得转载:九零后大叔的技术博客 » beanfactory篇-(五)init-method属性和InitializingBean接口的使用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

九零后大叔的技术博客

联系我们联系我们

感谢您的支持

支付宝扫一扫打赏

微信扫一扫打赏