helloworld
添加spring依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
创建实体类
在resources资源目录下添加applicationContext.xml配置文件,进行实体类对象的创建,由spring创建与管理 ```xml <?xml version=”1.0” encoding=”UTF-8”?>
4. 在测试方法中,获取实体类对象
1. 获取ClassPathXmlApplicationContext对象
1. 通过该对象getBean()方法获取实体类对象
1. 通过实体类对象调用方法
```java
public class SpringTest01 {
@Test
public void testSpringHello(){
//创建一个spring容器
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中取出service对象
UserService userService = (UserService) context.getBean("userService");
userService.save("旗木卡卡西");
}
}
分析spring创建对象
set注入
set注入是通过类的set方法对属性进行赋值操作的方式,如果需要赋值的成员变量没有set方法,那么它就不是一个属性,就不能进行set注入。
可以理解为一个bean就是一个对象。
id:这个对象的应用
class:类的全限定类名,表示创建这个类的对象
property:这个标签表示对象的一个属性(属性可以理解为拥有set方法的成员变量,spring通过set方法进行注入值,这种方式也叫set注入)
name:属性名
value:属性值
构造注入
构造注入是通过类的有参构造方法进行赋值操作的方式。如果这个类没有相应的有参构造方法就不能进行构造注入
constructor-arg:这个标签表示使用构造注入,name是参数名,value是参数值
index:表示当前参数的索引,不需要使用参数名,根据该参数在构造函数的位置就可以进行赋值,配合value标签使用
ref:表示引用类型的注入,ref的值是另一个对象引用。
bean一些常用的属性介绍
id:对象的引用,不可重复,bean的唯一标志,非必须,不能以数字开头,不能有特殊符号
class:类的全限定类名。非必须。主要是通过反射技术来创建对象的
name:bean的唯一标志。不能重复,不能以数字开头,可以有特殊符号,一个name可以配多个名字
scope:这个属性是用来配置当前bean是否单例。singleton表示单例,prototype表示多例。
<bean id="userDAO" scope="prototype" class="com.st.dao.impl.UserDAOImpl"/>
- 单例代表这个bean不是线程安全的,多例是线程安全的。
- scope有五个值
- singleton:单例,spring在初始化时,直接将这个类对象创建出来
- prototype:多例,spring初始化不创建类对象,获取类对象的时候才创建一个新的对象。
- request:一次请求中,web应用中偶尔用的
- session:一次会话,购物车对象
- application:web应用整个过程
init-method:指定初始化的方法,值是初始化方法的名字
destroy-method:指定销毁的方法,值是销毁方法的名字
- springbean的生命周期
- 创建spring容器时就会创建bean,执行init方法
new ClassPathXmlApplicationContexxt("配置文件名:一般都是applicationContext.xml");
- 关闭spring容器时执行destroy方法
spring容器的引用.close();//关闭spring容器
factory-bean:表示引用一个工厂。值是工厂对象的引用
factory-method:表示调用工厂中创建bean的方法,值是工厂中创建对象的方法名
<!-- 配置UserDAO的工厂,自定义工厂,没有实现FactoryBean接口 -->
<bean id="userDAOFactory" class="com.st.factory.UserDAOFactory"/>
<!-- 通过工厂创建UserDAO,不要配置class -->
<bean id="udao1" factory-bean="userDAOFactory" factory-method="createUserDAO"/>
我的理解:通过反射获取工厂类中创建UserDao对象的方法,invoke这个方法,获取bean。这个方法是被执行过的。
spring容器的整体架构(部分)
spring容器的获取方式
实际开发中,我们将不同内容的配置放在不同的配置文件中,从而会有多个配置文件,多个配置文件可以配合使用
创建容器的时候,同时传入多个配置文件:
@Test
public void testContext1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext- dao.xml","applicationContext-service.xml");
UserService bean = applicationContext.getBean(UserService.class);
bean.save("旗木卡卡西"); }
配置文件名是字符串类型,所以也可以用字符数组的形式。new String[] {"applicationContext-dao.xml","applicationContext-service.xml"}
还可以通过ClassPathXmlApplicationContext的无参构造方法获取。
@Test public void testContenxt3(){
//使用无参数的构造方法创建容器
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();
//设置配置文件路径
applicationContext.setConfigLocations("applicationContext- dao.xml","applicationContext-service.xml");
//加载对象
applicationContext.refresh();
UserService bean = applicationContext.getBean(UserService.class);
bean.save("旗木卡卡西");
}
spring容器的常见api
getBean:
- getBean(对象引用) //返回Object
- getBean(对象引用,Class<?>) //返回类型安全的对象
- getBean(Class<?>) //返回类型安全的对象,但是配置中不能有多个同类型的对象,不然spring找不到,报错
containsBean(对象引用) // 判断bean是否存在
isSingleton(对象引用) //判断bean是否单例
FactoryBean
BeanFactory是spring工厂的接口,定义了很多spring工厂的api。
FactoryBean是一个泛型的bean。可以通过FactoryBean来手动创建bean,与spring创建的bean不是同一个。
FactoryBean的使用:
- 创建一个类,继承FactoryBean接口,实现接口的方法
- 在接口的getObject()方法中创建我们要返回的对象
通过配置文件配置这个类,我们再通过spring容器获取的bean。
- 通过配置时的引用获取这个bean
获取到的是getObject()方法中返回的bean,而不是继承了FactoryBean接口的这个类的bean
public class CarFactory02 implements FactoryBean { public CarImpl getObject() throws Exception { CarImpl car = new CarImpl(); car.setBrand("阿斯顿马丁"); car.setPrice(2000000); car.setSport(false); return car; } public Class<?> getObjectType() { return Car.class; } }
<bean id="carFactory02" class="com.quail.spring.work04.impl.CarFactory02" />
@Test public void test3() throws Exception { // 通过容器获得的居然是getObject中返回的bean Car car = (CarImpl) context.getBean("carFactory02"); car.run(); }
如果想要获取FactoryBean的实现类的bean:在getBean中引用名前加上“&”
@Test public void test3() throws Exception { CarFactory02 carFactory02 = (CarFactory02) context.getBean("&carFactory02"); carFactory02.getObject().run(); }