创建对象
基础知识:
<!--创建对象: 声明bean,告知spring容器创建哪些对象一个bean标签表示一个对象id="对象名", 要求唯一class="完全限定名"注:spring底层通过反射创建对象,不能写接口相当于com.kkb.pojo.Team team1=new Team();然后将创建的对象放入到spring容器的一个map中springMap.put(id, 对象)例如:springMap.put("team1", new Team());-->
<!--name标签用的少一些,但是里面的限定会少一些--><!--singleton 马上创建(默认) 容器启动之后单例对象被创建了,而且容器中只有唯一的一个对象prototype 现用现去创建 多例对象 什么时候使用什么时候创建 --><!--lazy-init:true/false 是否懒加载,针对单例对象,懒加载之后会现用现去创建--><!--生命周期相关:只用于单例对象singletoninit-method:init, 对象创建完毕之后立即创建初始化方法destroy-method: spring容器调用销毁方法的时候执行的方法-->
测试用例:
Team.java
package com.kkb.pojo;public class Team {private Integer id;private String name;private String location;public Team(){System.out.println("构造方法被执行");}public Team(Integer id, String name, String location) {this.id = id;this.name = name;this.location = location;System.out.println("带参数的构造方法被执行 "+id+" "+name+" "+location);}public void init(){System.out.println("team------init------");}public void destroy(){System.out.println("team------destroy------");}}
application.xml
<bean id="team1" name="team1" class="com.kkb.pojo.Team" scope="singleton" lazy-init="true" init-method="init" destroy-method="destroy"> </bean><bean id="team2" name="team2" class="com.kkb.pojo.Team" scope="prototype"> </bean><!--获取非自定义对象,如日期--><bean id="date1" class="java.util.Date"> </bean>
<!--Spring容器创建对象的方式:1、通过默认构造方法2、通过带参数的构造方法3、通过工厂方法-->
创建对象的三种方法
bean包
package com.cq.pojo;public class Animal {private String type;private String variety;public Animal(){System.out.println("默认构造方法------被执行------");}public Animal(String type, String variety) {this.type = type;this.variety = variety;System.out.println("全参构造方法:------ "+"type: "+type+" variety: "+variety);}}
方式1:通过默认构造方法
src.main.resources.myApplication.xml
<!-- 自定义对象 --><bean id="cat" class="com.cq.pojo.Animal"></bean><bean id="dog" class="com.cq.pojo.Animal"></bean><!-- 非自定义对象 --><bean id="date1" class="java.util.Date"></bean>
src.test.java.com.cq.test.AnimalTest.java
@Testpublic void test01(){String applicationConfig = "myApplication.xml";ApplicationContext applicationContext = new ClassPathXmlApplicationContext(applicationConfig);Animal cat = (Animal)applicationContext.getBean("cat"); //强转System.out.println(cat);Animal dog = (Animal)applicationContext.getBean("dog");System.out.println(dog);int beanDefinitionCount = applicationContext.getBeanDefinitionCount(); //获取容器当中bean的数量System.out.println("容器当中元素的个数:"+beanDefinitionCount);String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();System.out.println("容器当中的对象名称:");for(String a: beanDefinitionNames){System.out.println("\t"+a); //获取容器当中对象的名称}//获取非自定义对象Date date1 = (Date)applicationContext.getBean("date1");System.out.println("当前时间:"+date1);}
方法2:通过带参数的构造方法
2.1 name获取Animal类中的元素名称
src.main.resources.myApplication.xml
<bean id="animal1" class="com.cq.pojo.Animal"><constructor-arg name="type" value="dog"/><constructor-arg name="variety" value="哈士奇"/></bean>
2.2 index获取下标(起始下标为0)
src.main.resources.myApplication.xml
<bean id="animal2" class="com.cq.pojo.Animal"><constructor-arg index="0" value="dog"/><constructor-arg index="1" value="哈士奇"/></bean>
方法3:通过工厂方法
3.1 实例方法
//实例方法public Animal instanceFun(){System.out.println("MyFactory------instanceFun------");return new Animal("cat", "加菲猫");}public static void main(String[] args) {MyFactory factory = new MyFactory();Animal animal2 = factory.instanceFun();}
<!-- id可以随便起 --><bean id="factory" class="com.cq.pojo.MyFactory"></bean><bean id="instanceAnimal" factory-bean="factory" factory-method="instanceFun"></bean>
3.2 静态方法
//静态方法public static Animal staticFun(){System.out.println("MyFactory------staticFun------");return new Animal("dog", "二哈");}public static void main(String[] args) {Animal animal1 = MyFactory.staticFun();}
<bean id="staticAnimal" class="com.cq.pojo.MyFactory" factory-method="staticFun"></bean>
