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);