Spring笔记(1)--<Bean>标签的基本配置


1.Spring

1.1Spring2大核心:

  1. IOC:控制反转

     作用:降低耦合
  2. AOP:面向切片编程

1.2入门实现步骤:

  1. 导入Spring开发的基本坐标
  2. 创建Spring核心配置文件:applicationContext.xml
  3. 在配置文件中进行配置
  4. 创建ApplicationContext对象getBean

1.3导入Spring基本坐标

<properties>
    <spring.version>5.0.5.RELEASE</spring.version>
</properties>
<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependencies> 
    <dependency>  
        <groupId>org.springframework</groupId> 
        <artifactId>spring-context</artifactId> 
        <version>${spring.version}</version>
    </dependency>
</dependencies>

2.创建Spring配置文件

2.1配置文件中配置UserDaoImpl

 <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>

2.2使用Spring的API获取Bean实例

ApplicationContext applicationContext = new  
ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao"); 
userDao.save();

3.Bean标签的基本配置

  1. id:Bean实例在Spring容器中的唯一标识
  2. class:Bean的全限定名称
  3. scope:指对象的作用范围

更多详细配置可以查看 BeanDefinitionParserDelegate的成员变量即为Bean标签的可取值

3.1scope取值范围

取值范围 说明
singleton 默认值:单例
prototype 多例的
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

1)当scope的取值为singleton时

​ Bean的实例化个数:1个

​ Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

​ Bean的生命周期:

对象创建:当应用加载,创建容器时,对象就被创建了

对象运行:只要容器在,对象一直活着

对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为prototype时

​ Bean的实例化个数:多个

​ Bean的实例化时机:当调用getBean()方法时实例化Bean

对象创建:当使用对象时,创建新的对象实例

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

3.2Bean的生命周期配置

init-method:指定类中的初始化方法名称

destroy-method:指定类中销毁方法名称

3.2Bean实例化的三种方式

  1. 使用无参构造

    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
  2. 工厂静态方法实例化

    public class StaticFactoryBean {
    public static UserDao createUserDao(){    
    return new UserDaoImpl();
    }
    }
    <bean id="userDao" class="com.itheima.factory.StaticFactoryBean" 
      factory-method="createUserDao" />
  3. 工厂实例方法实例化

    public class DynamicFactoryBean {  
    public UserDao createUserDao(){        
        return new UserDaoImpl(); 
    }
    }
    <bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/>
    <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

    4.Bean的依赖注入

    4.1步骤

  4. 将UserServiceImpl的创建权交给Spring

    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>
  5. 从Spring容器中获得UserService进行操作

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.save();

    4.2Bean的依赖注入方式

  6. 配置Spring容器调用有参构造时注入

    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">                     
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
  7. 配置Spring容器调用set方法进行注入

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
      <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
    </bean>
  8. set方法P命名空间注入

    需先引入p命名空间,其次,修改注入方式
    xmlns:p="http://www.springframework.org/schema/p"
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-
    ref="userDao"/>

    4.3Bean依赖注入的数据类型

  9. 普通数据类型的注入

    public class UserDaoImpl implements UserDao {
    private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    }
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="company" value="传智播客"></property>
    <property name="age" value="15"></property>
    </bean>
  10. 集合数据类型(List)

    public class UserDaoImpl implements UserDao {
     private List<String> strList;
     public void setStrList(List<String> strList) {
         this.strList = strList;
     }
    }
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
     <property name="strList">
         <list>
             <value>aaa</value>
             <value>bbb</value>
             <value>ccc</value>
         </list>
     </property>
    </bean>
  11. 集合数据类型(List)

    private List<User> userList;
     public void setUserList(List<User> userList) {
     this.userList = userList;  
    }
    <bean id="u1" class="com.itheima.domain.User"/>
    <bean id="u2" class="com.itheima.domain.User"/>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
     <property name="userList">
         <list>
             <bean class="com.itheima.domain.User"/>
             <bean class="com.itheima.domain.User"/>
             <ref bean="u1"/>
             <ref bean="u2"/>       
         </list>
     </property>
    </bean> 
  12. 集合数据类型(Map<String,User>)

    private Map<String,User> userMap;
     public void setUserMap(Map<String, User> userMap) {
     this.userMap = userMap;
     }    
    <bean id="u1" class="com.itheima.domain.User"/>
    <bean id="u2" class="com.itheima.domain.User"/>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
     <property name="userMap">
         <map>            
             <entry key="user1" value-ref="u1"/>
             <entry key="user2" value-ref="u2"/>
         </map>
     </property>
    </bean>
  13. 集合数据类型(Properties)

    private Properties properties;
     public void setProperties(Properties properties) {
         this.properties = properties;
     }
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
     <property name="properties">
         <props>
             <prop key="p1">aaa</prop>
             <prop key="p2">bbb</prop> 
             <prop key="p3">ccc</prop>
         </props>
     </property>
    </bean>

    4.4引入其他配置文件

    <import resource="applicationContext-xxx.xml"/>

    5.Spring相关的API

    5.1 ApplicationContext的继承体系

    接口类型.可通过实例过得Spring容器中的Bean对象

    5.2 ApplicationContext的实现类

  14. ClassPathXmlApplicationContext
    从类的根路径下加载配置文件(推荐使用)

  15. FileSystemXmlApplicationContext
    从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

  16. AnnotationConfigApplicationContext
    当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

    5.3 getBean()方法的使用

    //构造方法
    public Object getBean(String name) throws BeansException {  
     assertBeanFactoryActive();   
     return getBeanFactory().getBean(name);
    }
    public <T> T getBean(Class<T> requiredType) throws BeansException {                       assertBeanFactoryActive();
     return getBeanFactory().getBean(requiredType);
    }
  17. 其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。

  18. 当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错

ApplicationContext applicationContext = new 
            ClassPathXmlApplicationContext("applicationContext.xml");
  UserService userService1 = (UserService) applicationContext.getBean("userService");
  UserService userService2 = applicationContext.getBean(UserService.class);

  目录