携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解Spring的对象与创建方式,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan
对象Bean详解
<?xml version="1.0" encoding="UTF-8"?>
<!--Spring配置文件
1、beans:根标签
2、spring-beans.xsd是一个约束文件。约束XML中能编写那些标签
-->
<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.xsd">
<!--
创建对象,声明bean,通知spring要创建那个类的对象
一个bean标签声明一个对象:
id="自定义对象名",要求唯一
class 完全限定名字,不能是接口(因为Spring底层是通过反射来创建对象的)
当容器被创建的时候,对象就自动生成(相当于 new Class【类名】() )然后放入到Spring的一个集合(Map类)中
相当于SpringMap.put(id,创建的对象); 例如 SpringMap.put("team1",new Team());
-->
<!--自定义对象的创建-->
<bean id="team1" class="com.jinhuan.pojo.Team"></bean>
<bean id="team2" class="com.jinhuan.pojo.Team"></bean>
<!--非自定义对象的创建-->
<bean id="date" class="java.util.Date"></bean>
<!--Scope讲解
Scope:
prototype 表示是单例的(默认值)在容器启动的时候就被创建了,而且容器中的对象唯一
singleton 表示多例 在容器启动的时候没有被创建,什么时候使用了,什么时候被创建,每次获取的时候都是【新对象】!!!
-->
<bean id="team3" name="team3" class="com.jinhuan.pojo.Team" scope="prototype" ></bean>
<bean id="team4" name="team4" class="com.jinhuan.pojo.Team" scope="singleton"></bean>
<!--关于lazy-init 针对单例对象使用,因为多例的对象本身就是被获取的时候才创建
true:真的懒 只在对象被获取的时候创建
false: 假的懒 不管对象是否被获取都在容器启动的时候加载
default:false
-->
<bean id="team5" name="team5" class="com.jinhuan.pojo.Team" scope="singleton" lazy-init="true"></bean>
<!--【对象的声明周期有关的方法】init-method与destroy-method
init-method:表示对象一旦被创建就立马执行该方法
destroy-method:表示spring容器调用关闭方法区销毁对象的时候,立即执行该方法
-->
<bean id="team6" name="team6" class="com.jinhuan.pojo.Team" scope="singleton" init-method="init" destroy-method="destory"></bean>
</beans>
Spring创建对象的三种方式
1、通过默认的构造方法
2、通过带参数的构造方法
3、通过工厂方法
createType.xm
<?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.xsd">
<!--Spring创建对象的三种方式
1、通过默认的构造方法
2、通过带参数的构造方法
3、通过工厂方法
-->
<!--通过默认的构造方法-->
<bean id="team1" class="com.jinhuan.pojo.Team"></bean>
<!--通过带参数的构造方法
1、对象必须有含参构造
2、调用那个含参的构造方法,其参数要写完整
可以用index代替name,index从0开始,表示参数的下标
name表示参数的名字
-->
<bean id="team2" class="com.jinhuan.pojo.Team">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="勇士"/>
<constructor-arg name="location" value="金州"/>
</bean>
<bean id="team3" class="com.jinhuan.pojo.Team">
<constructor-arg index="0" value="2"/>
<constructor-arg index="1" value="热火"/>
<constructor-arg index="2" value="迈阿密"/>
</bean>
<!--通过工厂方法
1、静态方法 相当于Team staticTeam = MyFactory.staticInit();
2、实例方法 相当于MyFactory myFactory = new MyFactory();
Team instanceTeam = myFactory.instanceInit();
-->
<!--静态方法
注意此处的Class变成了工厂 Factory
-->
<bean id="staticTeam" class="com.jinhuan.pojo.MyFactory" factory-method="staticInit"/>
<!--实例方法
先创建工厂,在创建实例-调用方法
-->
<bean id="factory" class="com.jinhuan.pojo.MyFactory"/>
<bean id="instanceTeam" factory-bean="factory" factory-method="instanceInit"/>
</beans>
MyFactory
package com.jinhuan.pojo;
/**
* @Author jinhuan
* @Date 2022/5/9 18:15
* Description:实体类工厂
*/
public class MyFactory {
/**
* 静态方法
* */
public static Team staticInit(){
System.out.println("Static---------Init()");
return new Team(1001,"灰熊","孟菲斯");
}
/**
* 实例方法
* */
public Team instanceInit(){
System.out.println("Instance---------Init()");
return new Team(1002,"雄鹿","密尔沃基");
}
public static void main(String[] args) {
//测试MyFactory
//获取静态对象
Team staticTeam = MyFactory.staticInit();
//获取实例对象
MyFactory myFactory = new MyFactory();
Team instanceTeam = myFactory.instanceInit();
}
}
Team
package com.jinhuan.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Author jinhuan
* @Date 2022/5/9 15:39
* Description:球队的实体类
*/
@Component
public class Team {
@Value("8080")
private Integer id;
@Value("公牛")
private String name;
@Value("芝加哥")
private String location;
public void init(){
System.out.println("Team....init().....");
}
public void destory(){
System.out.println("Team....destory().....");
}
public Team() {
System.out.println("无参数的构造方法: id->"+id+";name->"+name+";location->"+location);
}
public Team(Integer id, String name, String location) {
this.id = id;
this.name = name;
this.location = location;
System.out.println("带参数的构造方法: id->"+id+";name->"+name+";location->"+location);
}
@Override
public String toString() {
return "Team{" +
"id=" + id +
", name='" + name + ''' +
", location='" + location + ''' +
'}';
}
}
CreateTypeTest
package com.jinhuan.test;
import com.jinhuan.pojo.Team;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author jinhuan
* @Date 2022/7/2 22:34
* Description:测试对象的三种创建方式
*/
public class CreateTypeTest {
@Test
public void test01(){
//获取容器
ApplicationContext ac = new ClassPathXmlApplicationContext("createType.xml");
Team team1 = (Team) ac.getBean("team1");
Team team2 = (Team) ac.getBean("team2");
}
}