Spring

1. 介绍IOC

IOC就是控制反转,听上去很高大上,其实简单说,就是以前手动创建对象的实例,现在由spring代理你创建这个实例

2.HelloWorld

这里写了3个类和一个spring xml配置文件,

  • UserService.java - 接口
  • UserServiceImpl.java - 实现类
  • UserServiceTest.java - 测试类
  • springConfig.xml - spring配置文件

UserService.java

public interface UserService {

    /**
     * 添加用户
     */
    void addUser();
}

UserServiceImpl.java

public class UserServiceImpl implements UserService{/**
     * 实现接口方法
     */
    public void addUser() {
        System.out.println("添加用户成功");
    }
}

springConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans   xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
         
         
        <bean id="userServiceBean" class="com.test.spring.ioc.UserServiceImpl"></bean>
</beans>

UserServiceTest.java

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {

    @Test
    public void test() {
        //以前
     //UserService userService = new UserServiceImpl();
     //userService.addUser();
        
        /**
         * spring的写法,这是一个工厂类,这里有一个参数,参数对应配置文件的classpath位置,src为根目录
         */
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/com/test/spring/ioc/springConfig.xml");
        
        //这里的参数为 配置文件中 bean id,意思就是获取 对应id实例对象
        UserService us = (UserService)context.getBean("userServiceBean");
        us.addUser();
    }
}

3.作用域

在默认情况下,spring创建的所有对象都是单例,可以通过从以下的测试方法,可以得出结论

//创建对象1
UserService us_1 = (UserService)context.getBean("userServiceBean"); System.out.println(us_1);
//创建对象2 UserService us_2
= (UserService)context.getBean("userServiceBean"); System.out.println(us_2);

/**
*打印的结果为可以看出两个对象都是同一个
*
*/

如果想要创建多实例,那就需要修改他的作用域

 

  • singleton(默认)单例
  • prototype 多例
  • request 没研究
  • session 没研究
  • global session 没研究

在配置文件bean 添加scope属性修改为prototype,重新执行上面的测试方法,结果就是两个对象都不一样

<?xml version="1.0" encoding="UTF-8" ?>
<beans   xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
         
         
        <bean id="userServiceBean" class="com.test.spring.ioc.UserServiceImpl" scope="prototype"></bean>
</beans>

在单例的情况下,当你执行读取配置文件的时候,对象将会立即创建,但如果是多例的情况下,只有在执行getBean的情况下,才会被新建,可以通过以下方式来测试一下

public class UserServiceImpl implements UserService{

    /**
     * 可以不加这个构造函数,添加上这个构造函数的目的是测试实例化的生命周期
     */
    public UserServiceImpl() {
        System.out.println("实例化");
    }
    
    /**
     * 实现接口方法
     */
    public void addUser() {
        System.out.println("添加用户成功");
    }
}

4. 创建bean的方式

  • 默认方式 - <bean id="" class="">
  • 静态工厂 - 就是在一个静态类(里面所有方法都是静态的)里面提供一个静态方法,用于创建对象实例

  配置的写法

<?xml version="1.0" encoding="UTF-8" ?>
<beans   xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
         
         <!-- 静态工厂创建bean方式 -->
        <bean id="userServiceBean" class="com.test.spring.factory.MyFactory" factory-method="createUserService"></bean>
       
</beans>

  工厂MyFactory.java

/**
 * 静态工厂
 *
 */
public class MyFactory {

    /**
     * 创建一个userservice实例
     * @return
     */
    public static UserService createUserService() {
        return new UserServiceImpl();
    }
}
  • 实例工厂 - 在一个非静态类里面,提供一个方法用于创建对象实例

  配置写法

<?xml version="1.0" encoding="UTF-8" ?>
<beans   xmlns="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

        <!-- 实例工厂创建bean方式 -->
        <bean id="instanceFactoryBean" class="com.test.spring.factory.MyFactoryInstance"></bean>
      
     <!-- 通过上面的实例bean,调用里面的方法 --> <bean id="userServiceBean2" factory-bean="instanceFactoryBean" factory-method="createUserServiceInInstanceFactory"></bean> </beans>

  实例工厂

/**
 * 实例工厂
 *
 */
public class MyFactoryInstance {

    public UserService createUserServiceInInstanceFactory() {
        return new UserServiceImpl();
    }
}
原文地址:https://www.cnblogs.com/oscar1987121/p/10874613.html