2021-11-09 1.ioc笔记

1.为什么要使用IOC?

传统开发模式有以下几点问题:

  • 创建了许多重复对象,造成了资源浪费
  • 更换实现类需要修改多个地方
  • 创建和配置组件工作繁琐,给组件调用方带来极大不便

总结:调用者参与了生产组件和组件配置的工作,为了让调用方只关注如何调用,所以需要把组件的生产和配置通过一个东西单独管理,我们把这个东西称作容器,这种容器我们通常称为IOC容器

2.spring xml自动装配会找构造,指定了default-autowire=“byName”,就会根据set装配

3.注解装配

@Resource和@Autowrited的区别?

Autowrited默认通过byName找,找不到根据byName找,属性名和实现类名字不一致时,需要配合@Qualifier来指定实现类

Resource默认通过byName找,属性名和实现类名字不一致时,只需要name指定实现类,也可以说resource结合了@Autowired,@Qualifier两个标签

4.作用域singleton和原形prototype

当父级是单例,子级即使多例,也会只生成一个对象,因为父级只生成了一次,也只调用了一次自级,若想每一次自级生成不同的实例,需要这样写:

@Lookup
public abstract SunDaoImpl getSunDaoImpl();

有多个实现类时,返回类型决定生成那个实现类,不指定返回类型,则可以再lookup加实现类名字

5.BeanNameGenerator

不同包下相同命名会出现beanname重复错误:

不指定beanName时,注解生成的beanName和xml不一样

xml生成规则:全类名+ # + 自增数字从0开始

注解生成规则:短类名,首字母小写,example:Student-》student,如果类名前两个字母大写则返回本身beanName,example:STUdent-》STUdent

解决方案:5.2.3之后有这个类@ComponentScan(value = “com.sun”, nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)

5.2.3版本之前继承BeanNameGenerator重写generateBeanName

@Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        //获取全限定名称
        String beanClassName = definition.getBeanClassName();
//        //获取类名
//        String shortClassName = ClassUtils.getShortName(beanClassName);
        //小写首字母
//        String decapitalize = Introspector.decapitalize(shortClassName);
        return beanClassName;


    }

获取bean name

String[] strings = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, SunDaoService.class);
String join = StringUtils.join(strings);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值