码迷,mamicode.com
首页 > 编程语言 > 详细

Spring知识小计1

时间:2021-01-02 11:04:24      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:应用   spring   list   三种方式   ESS   文件   --   set   需要   

1. Bean标签

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

1.1 当scope的取值是singleton的时候

  • Bean的实例化个数:1

  • Bean的实例化时机:当Spring的核心文件被加载的时候

    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    
  • Bean的生命周期:

    • 创建:应用进行加载,容器创建的时候,对象被创建
    • 运行:只要容器还在,对象就一直存在
    • 销毁:应用卸载,容器销毁的饿时候,对象就被销毁了

1.2 当scope的取值是prototype的时候

  • Bean的实例化个数:多个,每次进行调用getBean的时候,都会实例化新的对象

  • Bean的实例化时机:调用getBean的时候

    Object userService = applicationContext.getBean("userService");
    
  • Bean的生命周期

    • 对象创建:当使用对象时,创建新的对象实例
    • 对象运行:只要对象在使用中,就一直活着
    • 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

2. 如何进行Bean的实例化

有三种方式:无参构造方法实例化工厂静态方法实例化工厂实例方法实例化

2.1 无参构造方法

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

这样就可以利用UserDao userDao = (UserDao)applicationContext.getBean(“userDao”);获得UserDao的对象了。

2.2 工厂静态方法

既然是工厂方法,肯定要先构造一个工厂放到spring容器中

public class StaticFactoryBean {
    public static UserDao createUserDao(){    
    	return new UserDaoImpl();
    }
}
<bean id="userDao" class="xqp.factory.StaticFactoryBean" 
      factory-method="createUserDao" />

其中factory-method是用来指向具体的方法的,这里因为是静态的,因此通过getBean()方法后会或的对应的class的属性,进而得到对应的类(不是类的对象),最后在根据factory-method方法来表明这个类应该调用那个方法来返回所需要的对象

2.3 工厂实例方法

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

3. Bean的依赖注入

依赖注入式Spring框架核心IOC的具体实现。在编写程序的时候,由于IOC的存在,对象的创建权被交给了Spring,但是代码中不可能出现没有依赖的情况,IOC的存在也只是降低了耦合而不是消灭了耦合。

3.1 依赖注入的两种方式

  • 构造方法注入(引用类型数据的注入为例)

    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    
  • set方法注入,引用类型数据的注入为例,如果是用的是xml方式的话set方法不能省略,但是如果使用的是注解方式,那么set方法可以省略)

    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;  
        } 
        @Override    
        public void save() {      
       		 userDao.save();
    	}
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"/>
    </bean>
    
    • 如果使用set方法注入,并且注入数据少的话可以使用p命名空间注入(就是简化了而已)。 P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

      • 首先,需要引入P命名空间:

        xmlns:p="http://www.springframework.org/schema/p"
        
      • 其次,需要修改注入方式:

        <bean id="userService" class="xqp.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
        

3.2 依赖注入的数据类型

  • 普通数据类型

    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;
        }
        @Override   
        public void save() {
            System.out.println(company+"==="+age);
            System.out.println("UserDao save method running....");   
        }
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl">
        <property name="company" value="大疆"></property>
        <property name="age" value="15"></property>
    </bean>
    
  • 引用数据类型

    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;  
        } 
        @Override    
        public void save() {      
       		 userDao.save();
    	}
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"/>
    </bean>
    
  • 集合数据类型

    • List<普通数据类型>

      public class UserDaoImpl implements UserDao {
      	private List<String> strList;
      	public void setStrList(List<String> strList) {
      		this.strList = strList;
      	}
          @Override   
      	public void save() {
              System.out.println(strList);
              System.out.println("UserDao save method running....");
      	}
      }
      
      <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>
      
    • List<引用数据类型>

      public class UserDaoImpl implements UserDao {
      	private List<User> userList;
      	public void setUserList(List<User> userList) {
      		this.userList = userList;  
       	}
          @Override   
      	public void save() {
      		System.out.println(userList);
      		System.out.println("UserDao save method running....");
      	}
      }
      
      <bean id="userDao" class="xqp.dao.impl.UserDaoImpl">
          <property name="userList">
              <list>
              	<!--进行引用类型的注入-->
                  <bean class="xqp.domain.User" ref="user1"/>
                  <bean class="xqp.domain.User" ref="user2"/>
              </list>
          </property>
      </bean>
      
      <bean id="user1" class="xqp.domain.User">
            <!--User里面也有属性,因此也需要一块进行注入-->
            <property name="name" value="Tom"></property>
            <property name="addr" value="beijing"></property>
      </bean>
      <bean id="user2" class="xqp.domain.User">
            <!--User里面也有属性,因此也需要一块进行注入-->
            <property name="name" value="Lucy"></property>
            <property name="addr" value="tianjing"></property>
      </bean>
      
    • Map

      <bean id="user1" class="xqp.domain.User">
            <!--User里面也有属性,因此也需要一块进行注入-->
            <property name="name" value="Tom"></property>
            <property name="addr" value="beijing"></property>
      </bean>
      <bean id="user2" class="xqp.domain.User">
            <!--User里面也有属性,因此也需要一块进行注入-->
            <property name="name" value="Lucy"></property>
            <property name="addr" value="tianjing"></property>
      </bean>
      
      <property name="userMap">
          <map>
              <!--这个key代表的map的key,叫啥都行,无所谓-->
              <!--ref指向的是要注入的Bean,是要引用容器当中的Bean的id-->
              <entry key="aaaa" value-ref="user1"></entry>
              <entry key="bbbb" value-ref="user2"></entry>
          </map>
      </property>
      
    • Properties

      public class UserDaoImpl implements UserDao {
          private Properties properties;
          public void setProperties(Properties properties) {
              this.properties = properties;
          }
          
          @Override 
      	public void save() {
      		System.out.println(properties);
      		System.out.println("UserDao save method running....");
      	}
      }
      
      <bean id="userDao" class="xqp.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>
      

Spring知识小计1

标签:应用   spring   list   三种方式   ESS   文件   --   set   需要   

原文地址:https://www.cnblogs.com/xiaoqingnianXQP/p/14206400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!