【SSM_Spring】学习笔记02

一、Spring配置的一些小笔记

1、<bean>标签的属性:

           <bean name="user" class="com.dunka.bean.User" lazy-init="true">

a)  name 是一个名字,可以通过name到容器获取对象
            name 可以使用特殊字符、可以重复,但是实际开发中并不推荐
            其中 id和name 基本相同,但不能使用特殊字符亦不能重复 

b)class 是被管理对象的全包名,spring根据全包名创建对象

c)延迟加载lazy-init true 就是创建容器时不加载配置的bean对象,在获取的时候才创建 

      ***ApplicationContext配置的所有bean都会在容器创建的时候被创建出来,而且都是以空参构造方法为默认方法。

d)scope="singleton" 单例模式 容器只创建一个对象,每次向容器请求分配对象,都是同一个对象 

   scope="prototype"多例模式 容器在每次请求都会创建新的对象,所以每次getBean都是新的对象。

   scope="request" 在web环境下,如果这个对象属性scope为request被创建出来,其生命周期会与request的一致,请求结束则die

   scope="session"同理,与session的生命周期一致

e)init-method:初始化方法,在对象创建之后调用的初始化方法,单例、多例适用

f)destory-method:销毁方法,在容器关闭的使用,acontext.close(),之后调用这个方法。但有一点要注意的是,scope="prototype"时,对象由容器交由我们自己管理,所以在关闭容器的时候,并不会调用这个方法。

2、属性注入

a)SET方法

值属性注入

	<bean name="user" class="com.dunka.bean.User">
		<!-- 属性注入 SET方法 -->
		<property name="u_id" value="1"/>
		<property name="u_username" value="隔壁老杨"/>
		<property name="u_password" value="123456"/>
	</bean>

  引用对象注入

public class User {
	private Integer u_id;
	private String u_username;
	private String u_password;
	private Pet u_pet;
}
public class Pet {
	private String petType;
	private String color;
}
<bean name="user" class="com.dunka.bean.User">
		<!-- 属性注入 SET方法 -->
		<property name="u_id" value="1"/>
		<property name="u_username" value="隔壁老杨"/>
		<property name="u_password" value="123456"/>
		<!-- 属性注入 引用对象注入 -->
		<property name="u_pet" ref="dog"/>
	</bean>
	
	<!-- 将Pet交由Spring容器管理 被引用对象-->
	<bean name="dog" class="com.dunka.bean.Pet">
		<property name="petType" value="柴犬"/>
		<property name="color" value="黄色"/>
	</bean>

b)构造方法注入

name是指构造方法中的相对应的参数名,value是值类型的注入、ref是引用对象类型的注入、type用于指定参数类型,index用于指定参数的位置(从0开始)

public User(String u_username, Pet u_pet) {
		System.out.println("方法1 String ,Pet");
		this.u_username = u_username;
		this.u_pet = u_pet;
	}

	public User(Integer u_username, Pet u_pet) {
		System.out.println("方法2 Integer ,Pet");
		this.u_username = u_username.toString();
		this.u_pet = u_pet;
	}
	
	public User(Pet u_pet,Integer u_username) {
		System.out.println("方法3 Pet ,Integer");
		this.u_username = u_username.toString();
		this.u_pet = u_pet;
	}




<bean name="user1" class="com.dunka.bean.User">
		<constructor-arg name="u_username" value="666" type="java.lang.Integer" 
             index="0" />
		<constructor-arg name="u_pet" ref="dog" index="1"/>
	</bean>

c)复杂类型注入:array\list\set\map\properties

 复杂类型实体类:

public class MyCollection {
	//数组
	private Object[] array;
	//list
	private List list;
	//set
	private Set set;
	//map
	private Map map;
	//Properties
	private Properties pro;
}

在applicationContext_injection.xml中加入的bean标签:可以注意到的是在每一种类型的赋值里,都可以用<ref bean="dog"/>引用之前的bean,以达到值复用的效果,无须重复赋值

<!-- 复杂类型注入 -->
	<bean name="collection" class="com.dunka.bean.MyCollection">
		<!-- array数组 -->
		<property name="array" >
			<array>
				<value>123</value>
				<value>abc</value>
				<ref bean="dog"/>
			</array>
		</property>
		<!-- list -->
		<property name="list">
			<list>
				<value>456</value>
				<value>jdj</value>
				<ref bean="user1"/>
			</list>
		</property>
		<!-- set -->
		<property name="set">
			<set>
				<value>999</value>
				<value>dunka</value>
				<ref bean="dog"/>
			</set>
		</property>
		<!-- map -->
		<property name="map">
			<map>
			 	<entry key="username" value="dddd"/>
			 	<entry key="password" value="123"/>
			 	<entry key-ref="user1" value="dog"/>
			</map>	
		</property>
		<!-- properties -->
		<property name="pro">
			<props>
				<prop key="name">老杨</prop>
				<prop key="user1">dog</prop>
			</props>
		</property>
	</bean>

测试类 

	@Test
	public void test_injection1() {
		
		ClassPathXmlApplicationContext aContext = new ClassPathXmlApplicationContext("applicationContext_injection.xml");
		MyCollection mC = (MyCollection) aContext.getBean("collection");
		System.out.println(mC);
	}

由于没有使用过properties,所以我上网找了一篇文章专门说java.util.properties的,说的很详细,稍微明白这个类型是做什么的。如果以后会用到,便于回顾:https://www.cnblogs.com/bakari/p/3562244.html

二、注解配置

(1)将对象注册到容器

a)导入aop包,添加context的约束

并开启组件扫描,以下例子重点说明实体类的注解

<?xml version="1.0" encoding="UTF-8"?>
<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">
	
	<!-- 开启组件扫描  base-package 扫描该包以及其子包下的所有注解 -->
	<context:component-scan base-package="com.dunka.bean"/>

</beans>

b)建立一个User2实体类


//<bean name="user" class="com.dunka.bean.User">
@Component("user")
//@Controller("user") 	 //对应web层
//@Service("user")		 //对应Service层
//@Repository("user")    //对应DAO层
//@Scope(scopeName="prototype")
public class User2 {
	
	@Value(value="1")//在字段上使用此注解是暴力反射下的结果,不推荐
	private Integer u_id;
	private String u_username;
	private String u_password;
	private Pet u_pet;
	
	public User2() {
		System.out.println("User2空构造方法");
	}
	

	public Integer getU_id() {
		return u_id;
	}
	public void setU_id(Integer u_id) {
		this.u_id = u_id;
	}
	public String getU_username() {
		return u_username;
	}
	@Value("Dunka") //直接在SET方法上注入
	public void setU_username(String u_username) {
		this.u_username = u_username;
	}
	public String getU_password() {
		return u_password;
	}
	public void setU_password(String u_password) {
		this.u_password = u_password;
	}
	
	public Pet getU_pet() {
		return u_pet;
	}
	//自动装配,在容器中只有一个对象的时候适用
//	@Autowired
	//手动装配,容器中有多个同类型对象
	@Resource(name="dog")
	public void setU_pet(Pet u_et) {
		this.u_pet = u_et;
	}
	
	
	@Override
	public String toString() {
		return "User [u_id=" + u_id + ", u_username=" + u_username + ", u_password=" + u_password + ", u_et=" + u_pet
				+ "]";
	}
	//在构造方法后调用
	@PostConstruct
	public void userInit() {
		System.out.println("userInit");
	}
	//在销毁之前调用
	@PreDestroy
	public void userDestory() {
		System.out.println("userDestory");
	}
}

这里解释一下各个注解:

(1)在XML文件中配置这个<bean name="user" class="com.dunka.bean.User">标签,相对应以下的@Component\@Controller\@Service\@Repository四个注解,在实际开发应用中比较少使用到@Component,其他三个标签使用在对应的层开发中,会更清晰并且易读懂
@Component("user")
@Controller("user")      //对应web层
@Service("user")         //对应Service层
@Repository("user")    //对应DAO层

 

@Scope(scopeName="prototype")这个注解是对应<bean>中的scope属性,在没有注解的情况下默认是单例模式,可以通过注解中的属性更改创建对象的模式。

@PostConstruct 在构造方法后调用

@PreDestroy 在销毁之前调用

对于简单的属性注入:可在字段上、SET方法上使用

@Value(value="1")//在字段上使用此注解是暴力反射下的结果,不推荐

@Value("Dunka") //直接在SET方法上注入

对于对象的引用注入:

 @Autowired 自动装配,在容器中只有一个对象的时候适用
 @Resource(name="dog") 手动装配,容器中有多个同类型对象
    
c)测试类

@Test
	public void test_injection1() {
		ClassPathXmlApplicationContext aContext = new ClassPathXmlApplicationContext("applicationContext_annotation.xml");
		User2 user2 = (User2) aContext.getBean("user");
		User2 user3 = (User2) aContext.getBean("user");
		System.out.println(user2 == user3);
		aContext.close();
	}
@Test
	public void test_injection2() {
		ClassPathXmlApplicationContext aContext = new ClassPathXmlApplicationContext("applicationContext_annotation.xml");
		User2 user2 = (User2) aContext.getBean("user");
		System.out.println(user2);
	
	}

(2)Spring_JUnit框架整合

a)导入test包

利用之前的实体类,写一个测试

@RunWith(SpringJUnit4ClassRunner.class) //使用junit进行测试,帮助我们创建容器
@ContextConfiguration("classpath:applicationContext_injection.xml") //读取配置文件
public class test_SpringUnit {

	@Resource(name = "dog")
    private Pet pet;
	@Test
	public void test_injection() {
		System.out.println(pet);
	}
	
}

其中的注解说明:

@RunWith(SpringJUnit4ClassRunner.class)  使用junit进行测试,帮助我们创建spring容器
@ContextConfiguration("classpath:applicationContext_injection.xml") 读取配置文件

(3)分包配置问题:一个项目中可能会有很多配置文件,这时候需要有一个主配置文件,集中扫描该配置文件,将其他会引用到的配置文件导入其中,用到<import>标签

<!-- 导入其他配置文件 -->
	<import resource="/applicationContext_injection.xml"/>

测试时:@ContextConfiguration中读取的是主配置文件的路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多啦CCCC梦

你的鼓励将是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值