1.bean的实例化
1.bean的实例化需要对应的类有默认的构造方法,不然无法创建实例而报错.
2.接口本身是不能被实例化的。在Spring中,实际上是通过获取接口的实现类来实例化对象,而不是直接实例化接口。
在代码中,通过以下代码实例化了UserDao接口对象:
UserDao userDao = (UserDao) ac.getBean("UserDao");
在applicationContext.xml中,配置:
<bean id="UserDao" class="ssmDemo.dao.impl.UserDaoImpl" />
所以,通过Spring的IoC容器实例化的对象实际上是UserDao接口的实现类UserDaoImpl的实例,而不是接口本身的实例。
2.注解
1.对于使用注解进行依赖注入的类,通常需要确保相关的bean类中拥有与注入属性对应的setter方法。这样Spring才能正确地注入相关的依赖。
2.将Bean的作用域设置为Prototype(多例)时,使用@PreDestroy
注解标记销毁方法时,它将不会生效,因为Spring容器不会在销毁Prototype Bean时自动调用该方法。
3.如果在类标注了@Scope("prototype")
,那么在容器初始化的过程中会首先创建类
的一个单例实例,也就是说会多初始化一次这个类,如下:
bean的类:
@Repository
@Scope("prototype") //多例
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user save ");
}
@PostConstruct
public void init() {
System.out.println("init... ");
}
@PreDestroy
public void destroy() {
System.out.println("destroy... ");
}
}
测试类:
public class APP {
public static void main(String[] args) {
//获取ico容器
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(SpringConfig.class);
ac.registerShutdownHook();
//获取bean
UserDao userDao = (UserDaoImpl) ac.getBean(UserDaoImpl.class);
userDao.save();
}
}
结果:
init...
init...
user save
从上例可以看出,init方法被调用了两次,也就是bean的类被多实例化了一次