Spring中的bean管理

来源:互联网 发布:淘宝口令在什么位置 编辑:程序博客网 时间:2024/06/06 08:29

一.配置文件没有提示问题

  • spring引入schema约束,把约束文件引入到eclipse中
    • 复制约束路径

这里写图片描述

二.Spring的bean管理(xml)

1.bean实例化的方式

(1).在spring里面通过配置文件创建对象

(2).bean实例化三种方式实现

  • 第一种 使用类的无参数构造创建(重点)

这里写图片描述

  • 类里面没有无参数的构造,出现异常

    这里写图片描述

  • 第二种 使用静态工厂创建

    • 创建静态的方法,返回类对象
<bean id="User1" class="cn.st.web.factory.UserFactory" factory-method="getUser">        </bean>
public class UserFactory {        //静态方法,返回User对象       public static User getUser() {           return new User();       }}
     public void fun1() {     ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");         User user=(User) context.getBean("User1");         System.out.println(user);         user.add();     }

这里写图片描述

  • 第三种 使用实例工厂创建
    • 创建不是静态的方法,返回类对象
public class UserFactory2 {        public User getUser2() {            return new User();        }}
   <bean id="UserFactory2" class="cn.st.web.factory.UserFactory2"></bean>   <bean id="User2" factory-bean="UserFactory2" factory-method="getUser2"></bean>
public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");         User user=(User) context.getBean("User2");         System.out.println(user);         user.add();     }

这里写图片描述

2.bean标签常用属性

(1).id属性:起名称,id属性值名称任意命名

  • id属性值,不能包含特殊符号(比如#等)
  • 根据id值得到配置对象

(2).class属性:创建对象所在类的全路径

(3).name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号

(4).scope属性

  • singleton:默认值,单例
 <bean id="User" class="cn.st.web.entity.User" scope="singleton">        </bean>
public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");         User user=(User) context.getBean("User");         User user1=(User) context.getBean("User");         System.out.println(user);         System.out.println(user1);     }

这里写图片描述

  • prototype:多例,与structs里面的action相似,action也是多实例
<bean id="User" class="cn.st.web.entity.User" scope="prototype">        </bean>
public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");         User user=(User) context.getBean("User");         User user1=(User) context.getBean("User");         System.out.println(user);         System.out.println(user1);     }

这里写图片描述

  • request:创建对象把对象放到request域里面
  • session:创建对象把对象放到session域里面
  • globalSession:创建对象把对象放到globalSession里面

3.属性注入

(1).创建对象时候,向类里面属性里面设置值

(2).属性注入的方式介绍(三种)

  • 使用set方法注入
  • 使用有参数构造注入
  • 使用接口注入

这里写图片描述

(3).在spring框架里面,只支持前两种方式

  • set方法注入
  • 有参数构造注入
A.使用有参数构造注入属性
  <!-- 使用有参数的构造方式传值 -->        <bean id="demo1" class="cn.st.web.factory.PropertyDemo1">             <constructor-arg name="username" value="小王"></constructor-arg>        </bean>
public class PropertyDemo1 {    private String username;     public PropertyDemo1(String username) {         this.username=username;    }     public void test1() {         System.out.println("..."+username);     }}
public class SpringDemo {    @Test     public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");             PropertyDemo1 propertyDemo1=(PropertyDemo1)context.getBean("demo1");         propertyDemo1.test1();     }}
...小王
B.使用set方法注入属性(重点)
 <!-- 使用set方式注入值 -->        <bean id="book" class="cn.st.web.entity.Book">               <property name="bookname" value="易筋经"></property>        </bean>
public class Book {    private String bookname;    public void setBookname(String bookname) {        this.bookname = bookname;    }    public void test() {        System.out.println(bookname);    }}
public class SpringDemo {    @Test     public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");             Book book=(Book)context.getBean("book");         book.test();     }}
易筋经

4.注入对象类型属性(重点)

(1).创建service类和dao类
  • 在service得到dao对象
(2).具体实现过程
  • 在service里面把dao作为类型属性
  • 生成dao类型属性的set方法
public class UserService {              private UserDao userDao;            public void setUserDao(UserDao userDao) {                this.userDao = userDao;            }}
(3).配置文件中完成

这里写图片描述

5.P名称空间注入

<beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:p="http://www.springframework.org/schema/p"<!--这一行-->    xsi:schemaLocation="        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="person" class="cn.st.web.entity.Person" p:pname="lucy">        </bean>
public class Person {    private String pname;    public void setPname(String pname) {        this.pname = pname;    }    public void test() {        System.out.println(pname);    }}
public class SpringDemo {    @Test     public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");             Person person=(Person)context.getBean("person");         person.test();     }}
lucy

6.注入复杂类型属性

  • 数组
  • list集合
  • map集合
  • properties类型
<bean id="person" class="cn.st.web.entity.Person">                   <!-- 数组 -->                   <property name="arrs">                         <list>                              <value>小王</value>                              <value>小马</value>                              <value>小唐</value>                         </list>                   </property>                    <!-- list -->                   <property name="list">                         <list>                              <value>小金</value>                              <value>小智</value>                              <value>小红</value>                         </list>                   </property>                    <!-- map -->                   <property name="map">                         <map>                            <entry key="aa" value="lucy"></entry>                            <entry key="bb" value="tom"></entry>                            <entry key="cc" value="mary"></entry>                         </map>                   </property>                   <!-- properties -->                   <property name="properties">                          <props>                               <prop key="driverClass">com.mysql.jdbc.Driver</prop>                               <prop key="username">root</prop>                               <prop key="password">T471912619</prop>                          </props>                   </property>        </bean>
public class Person {    private String [] arrs;    private List<String> list;    private Map<String, String> map;    private Properties properties;    public void setArrs(String[] arrs) {        this.arrs = arrs;    }    public void setList(List<String> list) {        this.list = list;    }    public void setMap(Map<String, String> map) {        this.map = map;    }    public void setProperties(Properties properties) {        this.properties = properties;    }    public void fun1() {        System.out.println(Arrays.toString(arrs));        System.out.println(list);        System.out.println(map);        System.out.println(properties);    }}
public class SpringDemo {    @Test     public void fun1() {         ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");             Person person=(Person)context.getBean("person");         person.fun1();;     }}
[小王, 小马, 小唐][小金, 小智, 小红]{aa=lucy, bb=tom, cc=mary}{driverClass=com.mysql.jdbc.Driver, password=T471912619, username=root}

三.IOC和DI区别

  • IOC:控制反转,把对象创建交给spring进行配置
  • DI:依赖注入,向类里面的属性中设置值

  • 关系:依赖注入不能单独存在,需要在ioc基础之上完成操作

这里写图片描述

这里写图片描述

四.Spring整合web项目原理

1.加载spring核心配置文件

这里写图片描述
new对象,功能可以实现,但是效率很低

  • 实现思想:把加载配置文件和创建对象过程,在服务器启动时候完成

2.实现原理

  • ServletContext对象
  • 监听器
  • 具体使用
    • 在服务器启动时候,为每个项目创建一个ServletContext对象
    • 在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象在什么时候创建
    • 使用监听器监听到ServletContext对象创建时候
    • 加载spring配置文件,把配置文件配置对象创建
    • 把创建出来的对象放到ServletContext域对象里面(setAttribute方法)
    • 获取对象时候,到ServletContext域得到(getAttribute方法)
原创粉丝点击