创建对象
基础知识:
<!--
创建对象: 声明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 是否懒加载,针对单例对象,懒加载之后会现用现去创建
-->
<!--
生命周期相关:只用于单例对象singleton
init-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
@Test
public 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>