zoukankan      html  css  js  c++  java
  • 【Spring学习笔记】2 ->配置

    XML配置

    name是起一个名字,我们可以通过这个name来利用容器获取对象
    name可以使用特殊字符 名字也可以重复(但不推荐将多个对象名字命名为重复的) !!!
    id与name作用相同 但不能重复 不支持特殊字符

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean name="user" class="com.hello.bean.User">
    </bean>
    </beans>
    

    class是被管理对象的全包名,spring会通过这个包名来创建对象

    空参构造

    xml
    value 什么都没有

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean name="user" class="com.hello.bean.User">
    </bean>
    </beans>
    

    user

    ps: public User() 改为带参构造会报错而不保留无参的话 会报错 要无参 要无参

    package com.hello.bean;
     
    public class User {
    	public User() {
    		System.out.println("空参构造方法调用");
    	}
    //	public User(int id, String name, String password) {
    //		
    //	}
    }
    

    test
    ApplicationContext 配置的所有bean都会在容器创建的时候被创建出来
    如果配置bean较多,那么在创建容器的时候,会产生内存过大的问题;这种情况在机器硬件性能较为落后的时候体现比较明显

    package com.hello.test;
     
    import org.junit.jupiter.api.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    import com.hello.bean.User;
     
    public class hellotest {
    	@Test
    	public void Test1() {
    		ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
    		User u= (User)application.getBean("user");//xml中 对应调用类的name//要进行一次强制转换
    	}
    }
    

    延迟加载

    default默认值为false 还有value 为true(延迟加载)创建容器时不加载配置的bean对象,在获取的时候才创建

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean name="user" class="com.hello.bean.User" lazy-init="false">
    <property name="id" value="11"/>
    <property name="name" value="root"/>
    <property name="password" value="88888888"/>
     
    </bean>
    </beans>
    

    if value == true 采用 需要自己构造 如 User u = ac.getBean(User.class);他会自己调用容器里面的对象 也就是对象已经被初始化了

    scope 配置

    public class hellotest {
    	@Test
    	public void Test1() {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		
    		User u = ac.getBean(User.class);
    		User u1 = ac.getBean(User.class);
    		User u2 = ac.getBean(User.class);
    	}
    }
    

    value = "singleton" 单例创建 也是默认值 只允许创建一个对象 下面创建的对象都是同一个地址 都是相同的

    value="prototype"多例创建新的对象 创建三个都是同值 但是都是三个独立的对象 存在不同的内存里面

    value = "request" 在web环境中,如果scope属性为request 那么这个对象被创建出来,他的生命周期会与request请求一致
    value = "session"生命周期与session一致

    初始化、销毁

    <bean name="user" class="com.hello.bean.User" lazy-init="false" scope="prototype" init-method="useInit" />
    
    

    然后在 对应的加载类中加入 init-method="useInit"         useInit方法;
    销毁:destroy-method="destory"    关闭容器对象后自己调用销毁
    注意:如果用多例创建后 是交给自己保管,也是要自己销毁
    Set注入
    xml  (在class 类里面加一个toString()) 几个注入值就要配几个set方法

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean name="user" class="com.hello.bean.User" lazy-init="false" scope="prototype">
    <property name="id" value="11"/>
    <property name="name" value="root"/>
    <property name="password" value="88888888"/>
     
    </bean>
    </beans>
    

    注入引用类型
    在user类型中注入引用类型 如 user增加一个宠物
    则在user里面加入下面代码段

    	private pet pet;
    	public pet getPet() {
    		return pet;
    	}
    	public void setPet(pet pet) {
    		this.pet = pet;
    	}
    

    然后在xml中增加 ref类型

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean name="user" class="com.hello.bean.User" lazy-init="false" scope="prototype">
    <property name="id" value="11"/>
    <property name="name" value="root"/>
    <property name="password" value="88888888"/>
    <property name="pet" ref="dog"></property>
    </bean>
    <bean name="dog" class="com.hello.bean.pet">
    <property name="color" value="黑色"/>
    <property name="petType" value="二哈"></property>
    </bean>
     
    </beans>
    

    构造方法的注入

    constructor-arg和property的区别:https://blog.csdn.net/u012887385/article/details/54617534

    生成一个全变量的构造函数constructor-arg 给这种注入使用

    非构造函数 则采用property

    通过type进行设置
    又如果构造方法不一样可以采用  X来说明是那个位置 
    复杂类型注入
    向容器内注入

    package ssm;
     
    import java.util.*;
    public class ssm_spring {
    	private Object[] array;
    	private Set set;
    	private Map map;
    	private List list;
    	private Properties prop;
    	public Object[] getArray() {
    		return array;
    	}
    	public void setArray(Object[] array) {
    		this.array = array;
    	}
    	public Set getSet() {
    		return set;
    	}
    	public void setSet(Set set) {
    		this.set = set;
    	}
    	public Map getMap() {
    		return map;
    	}
    	public void setMap(Map map) {
    		this.map = map;
    	}
    	public List getList() {
    		return list;
    	}
    	public void setList(List list) {
    		this.list = list;
    	}
    	public Properties getProp() {
    		return prop;
    	}
    	public void setProp(Properties prop) {
    		this.prop = prop;
    	}
    	@Override
    	public String toString() {
    		return "ssm_spring [array=" + Arrays.toString(array) + ", set=" + set + ", map=" + map + ", list=" + list
    				+ ", prop=" + prop + "]";
    	}
    }
    

    配置

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    <bean id="dog" class="com.hello.bean.pet">
    <property name="color" value="black"/>
    <property name="petType" value="kobi"/>
    </bean>
    <bean id="collection" class="ssm.ssm_spring">
    <property name="array">
    <array>
      <value>123</value>
       <value>789</value>
      <ref bean="dog"/>
      </array>
      </property>
    </bean>
    </beans>
    

    另外map方法的配置

    <property name="map">
     <map>
     <entry key="password" value="88888888"></entry>
     <entry key="username" value="123456" />
     </map>
     </property>
    

    properties的配置 《导入之后就可以遍历出来》

     <property name="prop">
     <props>
     <prop key="password">88888888</prop>
     </props>
     </property>
    

    注解配置

    开启逐渐注解开发 也就是说不用在xml文件上编写 直接在java文件的对应的方法名那里编写 @XXXXXXX
    首先要导入context.xsd文件
    才能使用context标签

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 会扫描该包下以及所有子包的所有注解 将对应包当成组件-->
    <context:component-scan base-package="com.hello.bean"/>
    </beans>
    
    import org.springframework.stereotype.Component;
     
    //<bean name="user" class="com.hello.bean.User">等同于下面的语句
    @Component("user")//named user
    public class User {
    ........
    }
    

    另外还有几个跟类似功能的层

    @Component("user")//named user
    @Controller() //对应web层
    @Service() //对应service层
    @Repository//对应dao层
    

    单例多例的配置

    @component("user")
    @Scope(scopeName="prototype")//多例单例scope用法 //默认单例  prototype为多例
    public class User{
    ......
    }
    

    初始化配置~

    @PostConstruct()//在构造方法后调用 初始化
    	public void init() {
    		System.out.println("初始化");
    	}
    

    销毁配置

    @PreDestroy()
    	public void destroy() {
    		System.out.println("销毁");
    	}
    

    (过程发现的笔记 本人看, pet 没有注入值 导致NULLPOINTEXCPETION)个人觉得是9.0新版本的问题

    public class User {
    	@Value(value="1")//破坏了封装性 这里注入还要set方法干嘛
    	private int id;
    @Value(value="1")
    	public void setId(int id) {
    		this.id = id;
    	}
    }
    
    
    public class user{
    private pet pet ;
    public pet getPet() {
    		return pet;
    	}
    	@Autowired//自动装箱操作 将pet.java的value配置导入到该项目内
    	public void setPet(pet pet) {
    		this.pet = pet;
    	}
    }
     
    pet.java
    @Conponent("cat")
    public class pet{
    private String petType;
    private String color;
    public String getPetType() {
    	return petType;
    }
    @Value("咖啡猫")
    public void setPetType(String petType) {
    	this.petType = petType;
    }
    public String getColor() {
    	return color;
    }
    @Value("咖啡色")
    public void setColor(String color) {
    	this.color = color;
    }
     
    }
    

    如果xml 一个对象有两种属性 注解会报错 混淆了
    //context里面包含cat的配置

    <context:component-scan base-package="com.hello.bean"/>
    <bean name="dog" class="com.hello.bean.pet">
    <property name="petType" value="二哈"></property>
    <property name="color" value="yellow"></property>
    

    手动指定

    @Resource(name="dog")
    	public void setPet(pet pet) {
    		this.pet = pet;
    	}
    

    JUnit4/5的问题看:https://blog.csdn.net/linmengmeng_1314/article/details/80044496
    包冲突java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/l
    https://blog.csdn.net/robert_lizhiqiang/article/details/39997621
    no tests found with test runner “Junit5” 包出错的问题 哪个包弄错了 或冲突了

    被这些包气死 老是弄错包 
    居然导包出错真的是 spring 有点东西
    JUnit测试提示Java.lang.Exception: No runnable methods
    https://blog.csdn.net/sinat_34104446/article/details/82781936(JUnit导包错误 ~~~)
    测试单元JUnit
    就省了applicationContext的配置
    切记ref 哪个xml 不要删了还不知道  导致报错 ~~~

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://www.springframework.org/schema/beans"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
    	
    	<bean name="user" class="com.hello.bean.User"
    		scope="prototype">
    		<property name="id" value="11" />
    		<property name="name" value="root" />
    		<property name="password" value="88888888" />
    		<property name="pet" ref="dog"></property>
    	</bean>
    	<bean name="dog" class="com.hello.bean.pet">
    		<property name="color" value="黑色" />
    		<property name="petType" value="二哈"></property>
    	</bean>
    </beans>
    
     
    import javax.annotation.Resource;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import com.hello.bean.pet;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext3.xml")
    public class JUnit {
    	@Resource(name="dog")
    	private pet pet;
    	@Test
    	public void Test1() {
    		System.out.println(pet.toString());
    	}
    }
    

    导入其他xml文件的方法

    <import resource="/applicationContext.xml"/>
    
    
  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/cznczai/p/11154866.html
Copyright © 2011-2022 走看看