org.springframework
spring-context
5.2.10.RELEASE
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
public static void main(String[] args) {
ApplicationContext c = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao=(BookDao) c.getBean("bookDao");
bookDao.save();
}
运行结果
book dao save ...
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book dao constructor is running ...");
}
public void save() {
System.out.println("book dao save ...");
}
}
运行程序,如果控制台有打印构造函数中的输出,说明Spring容器在创建对象的时候也走的式构造函数
输出结果:
book dao constructor is running ...
book dao save ...
public class BookDaoImpl implements BookDao {
private BookDaoImpl() {
System.out.println("book dao constructor is running ...");
}
public void save() {
System.out.println("book dao save ...");
}
}
运行程序能执行成功,说明内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的式反射
运行结果:
book dao constructor is running ...
book dao save ...
public class BookDaoImpl implements BookDao {
private BookDaoImpl( int i) {
System.out.println("book dao constructor is running ...");
}
public void save() {
System.out.println("book dao save ...");
}
}
运行程序报错,说明Spring底层使用的式类的无参构造方法。
public interface OrderDao {
public void save();
}
public class OrderDaoImpl implements OrderDao {
public void save(){
System.out.println("order dao save ...");
}
}
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setuo ...");
return new OrderDaoImpl();
}
}
public class AppForIntanceOrder {
public static void main(String[] args) {
ApplicationContext c= new ClassPathXmlApplicationContext("applycationContext.xml");
OrderDao orderDao= (OrderDao) c.getBean("orderDao");
orderDao.save();
}
}
运行结果为:
oeder dao save ...
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("user dao save ...");
}
}
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
实例化工厂运行的顺序是:
public class AppForIntanceUser {
public static void main(String[] args) {
ApplicationContext c=new ClassPathXmlApplicationContext("applycationContext.xml");
UserDao userDao= (UserDao) c.getBean("userDao");
userDao.save();
}
}
user dao save ...
FactoryBean的使用
public class UserDaoFactoryBean implements FactoryBean {
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class> getObjectType() {
return UserDao.class;
}
}
user dao save ...
这种方式在Spring去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。
查看源码会发现,FactoryBean接口其实会有三个方法,分别是:
T getObject() throws Exception;
Class> getObjectType();
default boolean isSingleton() {
6return true;
}