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 {@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}@Overridepublic Class> getObjectType() {return UserDao.class;}
}
user dao save ...
这种方式在Spring去整合其他框架的时候会被用到,所以这种方式需要大家理解掌握。
查看源码会发现,FactoryBean接口其实会有三个方法,分别是:
T getObject() throws Exception;Class> getObjectType();default boolean isSingleton() {
6return true;}