12.Bean使用拾遗(二)

本文深入探讨Spring框架中Bean的高级用法,包括@Autowired、@Resource、@Inject的区别,Component-scan配置详解,以及如何使用DefaultListableBeanFactory动态添加Bean。通过实际代码示例,帮助读者理解并掌握这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.Bean使用拾遗(二)

1. Autowired/Resource/Inject

  1. @Autowired byType, 有required属性
  2. @Resource(Java Content depentment inject standard JSR-299) by name, 无required属性
  3. @Inject(Java Content depentment inject standard JSR-250) byType, 无required属性

2. Componet-scan

<?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 http://www.springframework.org/schema/context/spring-context.xsd"
       default-autowire="default">


    <context:component-scan base-package="com.desmond.springlearning.component_scan">
        <context:include-filter type="aspectj" expression="com.desmond.springlearning.component_scan..*Service+"/>
        <context:exclude-filter type="regex" expression="com.desmond.springlearning.component_scan.dao.*"/>
    </context:component-scan>

</beans>
package com.desmond.springlearning.component_scan.dao;

import lombok.Data;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:05
 */
@Data
public class DemoDao {
    private String name;

    public DemoDao() {
        this.name = "dao";
    }
}
package com.desmond.springlearning.component_scan.service;

import lombok.Data;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:05
 */
@Data
public class Demo2Service {
    private String name;

    public Demo2Service() {
        this.name = "service";
    }
}
package com.desmond.springlearning.component_scan.service;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:06
 */
public class DemoService {
}
package com.desmond.springlearning.component_scan;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * @author presleyli
 * @date 2018/10/24 下午9:22
 */
public class Test {
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("component_scan/application.xml");
        XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(resource);

        System.out.println(xmlBeanFactory.containsBean("demoDao"));
        System.out.println(xmlBeanFactory.containsBean("demo2Service"));
        System.out.println(xmlBeanFactory.containsBean("demoService"));
    }
}
output:
false
true
true

3. DefaultListableBeanFactory动态添加Bean

package com.desmond.springlearning.dynamica_bean;

import lombok.Data;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:29
 */
@Data
public class UserDao {
    private String name;
}
package com.desmond.springlearning.dynamica_bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:29
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserService {
    private UserDao userDao;
}
package com.desmond.springlearning.dynamica_bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * @author presleyli
 * @date 2018/10/25 上午8:27
 */
public class UserServiceFactory implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        DefaultListableBeanFactory factory = (DefaultListableBeanFactory) configurableListableBeanFactory;

        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);
        beanDefinitionBuilder.addPropertyReference("userDao", "userDao"); // 已经存在的do

        factory.registerBeanDefinition("userService1", beanDefinitionBuilder.getRawBeanDefinition());

        factory.registerSingleton("userService2", new UserService());
    }
}
package com.desmond.springlearning.dynamica_bean;

import com.desmond.springlearning.method_replace.Boss1;
import com.desmond.springlearning.method_replace.Boss2;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.cglib.core.DebuggingClassWriter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

/**
 * @author presleyli
 * @date 2018/10/24 下午9:22
 */
public class Test {
    public static void main(String[] args) {

        ApplicationContext factory = new ClassPathXmlApplicationContext("listable/application.xml");

        UserService userService1 = (UserService)factory.getBean("userService1");
        UserService userService2 = (UserService)factory.getBean("userService2");

        System.out.println(userService1);
    }
}
<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="default">

    <bean id="userServiceFactory" class="com.desmond.springlearning.dynamica_bean.UserServiceFactory"/>

    <bean id="userDao" class="com.desmond.springlearning.dynamica_bean.UserDao" p:name="from xml"/>

</beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值