概念
IOC----控制反转 意思就是将对象的创建权力交给spring 提前在spring容器中构建好了spring对象,如此我们可以通过spring 容器直接调用getBean("name属性或者ID名称”)----》获取对应的对象
需要使用到的类
-
ApplicationContext
使用它需要借助于他的实现类 ClassPathXmlAppliCationContext ,默认会在创建的时候将内部的配置对象全部加载到Spring容器当中.
-
ClassPathXmlAppliCationContext
将来我们可以从ClassPath目录下加载到我们的Spring主配置文件.
Bean元素的配置和创建
凡是交给Spring容器管理的对象,都可以通过Bean元素进行配置,Spring的本质就是对象管理容器,就是拿来管理对象的,底层就是使用Map来存储对象的.
1,name和class属性
- name属性:作用就是给创建的对象起一个名字,将来在应用中我们是通过这个名字获取这个对象,name属性值可以重复,但是设置的时候一般也是设置为唯一的。
- class属性:创建该对象映射的哪个类, 反射机制 , 全路径 = 包名 + 类名
- id属性: id1属性和name属性的作用几乎是一样的 但是id值不能重复 并且 id属性值里面不能含有特殊字符。
代码演示
<!--通过标识id找到对象,配置UserDaoImpl类到容器里面.-->
<!--目的就是提前配置好,到时候不用去new对象直接从这里面得到就可以了 就是通过反射过来的-->
<bean id="userDao" class="com.zhiyou100.dao.impl.UserDaoImpl"></bean>
2.bean元素的创建
1.空参构造
bean元素的创建,默认就是采用空参构造来的,如果没有空参构造,那么就会报错
空参构造分为单例模式和多例模式
单例模式:一个对象被创建,调用多少次都是同一个对象 bean中加属性scope=singleton
多例模式:一个对象被创建,每使用一次就调用一次 bean中加属性scope=prototype
代码演示
<!--备案元素的创建-->
<!--方式一: 空参构造创建 user --><!--经常使用的是这个方式-->
<!-- id:以后使用后这个bean就调用id值 class:就是指定兑现故事呢一个类的 -->
<bean id="user" class="com.zhiyou100.pojo.User" scope="singleton"></bean>
<!--多例模式-->
<bean id="user1" class="com.zhiyou100.pojo.User" scope="prototype"></bean>
bean元素的生命周期
初始化:init-method()
先初始化在创建对象
销毁:destroy-method()
第一:长期不使用就会自动销毁
第二:容器销毁或者关闭的时候,存储在容器里面的bean对象就会销毁
bean元素是交给spring来管理的,如果吧bean元素的scope设置为多例模式,那么就只关产生不管销毁
<!--初始化方法 init-method 销毁方法 destroy-method="destroyUser" -->
<bean id="user2" class="com.zhiyou100.pojo.User" init-method="initUser" destroy-method="destroyUser"></bean>
2.对象创建第二种方式:静态工厂方式
<!--方式二:静态工厂方式 factory-method:指定当前应用类中的静态方法 -->
<bean id="userStatic" class="com.zhiyou100.pojo.BeanFactory" factory-method="getStaticBean"></bean>
3.对象创建第三种方式:实例工厂方式
<!--方式三:实例工厂方式 第二个的 factory-bean 对应 第一个的 name 第二个的name才是测试类里免得标识。
在 第二个的 factory-bean 对应 第一个的 name 对应的时候 factory-method 才能找到我们想要的方法。
-->
<bean name="userBeanFactory" class="com.zhiyou100.pojo.BeanFactory"></bean>
<bean name="userFactory" factory-bean="userBeanFactory" factory-method="getUser"></bean>
scope属性
scope 范围区域的意思 spring中,作用是设置bean元素创建对象的方式
-
singleton 表示单例模式 容器中的对象有且只有一个 如果设置了单例模式 表示当前的对象在容器中只会创建一次,创建了之后,去测试类里面调用,调用多少次都是同一个对象 如果在主配置文件里面再去给这个了配置一个对象,那么就是两个不同的对象 在Spring中默认就是采用的单例模式
-
prototype 表示多例模式 使用一次就构建一个新的对象 在 structs2 框架容器中就是默认独立模式的。
单例模式的时候,都是随着主配置文件的创建,对象全部加载 但是多例模式的时候是随用随加载,对象被创建出来了,但是没有被架子啊
-
request 在请求域中
-
session 会话 子啊服务器中
-
globalSession 全局的,跨越session存储的。
以上xml配置对应的接口,实现类,和测试类的代码
实体类User代码
//写上全参,无参,set get toString
public class User implements Serializable {
private Integer id;
private String username;
private String address;
private Date birthday;
private boolean gender;
实体类工厂(静态工厂和实例工厂会用到)
//静态方式,需要借助静态方法
public static User getStaticBean(){
System.out.println("采用的是静态方式创建对象");
return new User();
}
//成员方法
public User getUser(){
System.out.println("采用的是实例工厂方式创建");
return new User();
}
User测试类
public class BeanCreateTest {
/**
* 空参构造创建Bean元素
*/
@Test
public void testCreataBean(){
//第一步:完成了对主配置文件applicationContext.xml的加载
ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:从容器中获得想要的对象,user对应bean里面的id值
User user = container.getBean("user", User.class);
System.out.println(user);
}
/**
* 静态工厂方式创建Bean元素
*/
@Test
public void testStaticBean(){
//第一步:完成了对主配置文件applicationContext.xml的加载
ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:从容器中获得想要的对象,user对应bean里面的id值 User.class 是指定映射方式
User user = container.getBean("userStatic", User.class);
System.out.println(user);
}
/**
* 实例工厂方式创建Bean元素
*/
@Test
public void testInstanceBean(){
//第一步:完成了对主配置文件applicationContext.xml的加载
ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:从容器中获得想要的对象,user对应bean里面的id值 User.class 是指定映射方式
User user = container.getBean("userFactory", User.class);
System.out.println(user);
}
/**
* 单例模式下,。创建Bean元素,
*/
@Test
public void testSingletn(){
//第一步:完成了对主配置文件applicationContext.xml的加载
ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:从容器中获得想要的对象,user对应bean里面的id值
User user = container.getBean("user", User.class);
User user1 = container.getBean("user", User.class);
System.out.println(user == user1);
}
/**
* 多例模式下,。创建Bean元素,
*/
@Test
public void testPrototype(){
//第一步:完成了对主配置文件applicationContext.xml的加载
ApplicationContext container = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二步:从容器中获得想要的对象,user对应bean里面的id值
User user = container.getBean("user1", User.class);
User user1 = container.getBean("user1", User.class);
System.out.println(user == user1);
}