public class ServiceTest { public static void main(String[] args) { //Spring容器加载有3种方式 //第一种:ClassPathXmlApplicationContext ClassPath类路径加载,指的就是classes路径 //第一种:最常用,spring的配置文件路径以后就直接放在src ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //第二种方式:文件系统路径获得配置文件【绝对路径】 //ApplicationContext context = new FileSystemXmlApplicationContext("C://Users//Desktop//IDEAWorkspace//spring-01//src//com//rookie//beans.xml"); //第三种方式:使用BeanFactory(了解) //String path = "C://Users//Desktop//IDEAWorkspace//spring-01//src//com//rookie//beans.xml"; //BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path)); //IUserService user = (IUserService) factory.getBean("userService"); //user.add(); IUserService user = (IUserService) context.getBean("userService"); user.add(); } }
b.通过反射,用类型创建对象。 c.给创建的对象赋值。
ApplicationContext 是即时加载,对 BeanFactory 扩展,提供了更多功能。
案例演示(在第一次的代码基础上)
public class UserServiceImpl implements UserService { private String name; public void setName(String name) { this.name = name; } @Override public void add() { System.out.println("创建用户...." + name); } public UserServiceImpl(){ System.out.println("UserServiceImpl() 调用了"); } }
public class ServiceTest { public static void main(String[] args) { //1.加载beans.xml 这个spring的配置文件,内部就会创建对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); } }
控制台打印日志:UserServiceImpl( ) 调用了
public class ServiceTest { public static void main(String[] args) { String path = "C://Users//Desktop//IDEAWorkspace//spring-01//src//com//rookie//beans.xml"; BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path)); // 要使调用空参构造可以放开这段代码即可 // IUserService user = (IUserService) factory.getBean("userService"); } }
放开上面注释的代码,即可调用空参构造,控制台打印日志:UserServiceImpl( ) 调用了。
所谓的装配bean就是在xml写一个bean标签。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--装配bean的三种方式,所谓的装配bean就是在xml写一个bean标签--> <!-- 第一种方式: new 实现类--> <bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl"> <property name="name" value="zhangsan"></property> </bean> <!-- 第二种方式:通过静态工厂方法 --> <bean id="userService2" class="com.example.demo.service.UserServiceFactory" factory-method="createUserService"/> <!--第三种方式:通过实例工厂方法 --> <bean id="factory2" class="com.example.demo.service.UserServiceFactory2"/> <bean id="userService3" factory-bean="factory2" factory-method="createUserService"/> </beans>
第一种上次已经讲过,现在只讲第二、三种案例。
public class UserServiceFactory { public static UserService createUserService() { return new UserServiceImpl(); } } ========================================================================================= public class UserServiceFactory2 { public UserService createUserService() { return new UserServiceImpl(); } }
执行测试函数
public class ServiceTest { public static void main(String[] args) { //new 对象 ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml"); UserService userService1 = (UserService) context1.getBean("userService1"); userService1.add(); //静态工厂 ApplicationContext context2 = new ClassPathXmlApplicationContext("beans.xml"); UserService userService2 = (UserService) context2.getBean("userService2"); userService2.add(); //实例工厂 ApplicationContext context3 = new ClassPathXmlApplicationContext("beans.xml"); UserService userService3 = (UserService) context3.getBean("userService3"); userService3.add(); } }
感兴趣的可以自己看执行结果。三种结果都证明 bean 被 Spring 容器管理实例化了。
类别 | 说明 |
---|---|
singleton | 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean() |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境 |
globalSession | 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境 |
案例代码演示
bean.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl" scope="prototype"> </bean> </beans>
public class ServiceTest { public static void main(String[] args) { ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml"); UserService userService1 = (UserService) context1.getBean("userService1"); UserService userService2 = (UserService) context1.getBean("userService1"); System.out.println(userService1); System.out.println(userService2); } }
com.example.demo.service.impl.UserServiceImpl@2a556333
com.example.demo.service.impl.UserServiceImpl@7a187f14