前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring系列(一)——简介和IOC

spring系列(一)——简介和IOC

作者头像
逝兮诚
发布2019-10-30 13:06:04
3380
发布2019-10-30 13:06:04
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/70877077

Spring简介

Spring是轻型框架,有ioc(控制反转,最常见的方式叫做依赖注入(Dependency Injection,简称DI))和aop(面向切面)两个重要功能

IOC的思路是,不用代码创建对象,而配置对象(bean),在容器加载时,加载所有对象,要使用这些对象时,从容器对象中去获得。

Spring配置使用

配置文件

Spring容器的加载需要读取Spring的配置文件,文件是xml格式,可以定义bean。一个简单的Spring配置文件test1.xml

代码语言:javascript
复制
<?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">
    	
    	<bean id="test" class="java.lang.String">
    		<constructor-arg value="张三" />
    	</bean>
</beans>

xmlns是beans的命名空间,xmlns:xsi是它的一个属性叫做xsi,xsi:schemaLocation是xml编码所要遵守的格式。

随着加载的组建/框架的增多,xmlns这里也要添加新的属性

比如要使用注解注入,就要加上

代码语言:javascript
复制
xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation编码格式中加上

代码语言:javascript
复制
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd 

比如配置文件中要写dubbo的配置文件,就要加上

代码语言:javascript
复制
xmlns:dubbo=”http://code.alibabatech.com/schema/dubbo”

xsi:schemaLocation编码格式中加上

代码语言:javascript
复制
http://code.alibabatech.com/schema/dubbo          http://code.alibabatech.com/schema/dubbo/dubbo.xsd

如何加载Spring配置文件

java类

在普通的类中,可以通过代码的方式加载Spring的配置文件,得到Spring的容器对象,并获得容器对象中的bean对象

代码语言:javascript
复制
public class TestQ {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:F:/workspace1.8/sdz-web/WebContent/WEB-INF/test1.xml");
		context.start();
		System.out.println((String)context.getBean("test"));
	}
}

可以把代码重构一下

代码语言:javascript
复制
public class TestQ {
	
	private static ClassPathXmlApplicationContext context;
	
	static {
		context = new ClassPathXmlApplicationContext("file:F:/workspace1.8/sdz-web/WebContent/WEB-INF/test1.xml");
		context.start();
	}
	
	public static void main(String[] args) {
		System.out.println(context.getBean("test"));
	}
}

运行结果

web

在javaweb中可以通过配置web.xml来实现Spring容器的加载,需要配置contextConfigLocation参数,值是spring配置文件,并配置spring的监听器。当项目运行时,spring监听器会加载spring的配置文件,完成容器加载。

代码语言:javascript
复制
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>WEB-INF/spring-conf.xml</param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Bean的构造

Spring中<bean>实际上就是调用类的构造器。我给类的构造器加上打印语句,在spring中配置该类的bean,加载spring配置文件,可以发现调用了构造器的打印语句,故<bean>的实现是调用类的构造器。例子如下

Spring配置文件

代码语言:javascript
复制
<?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">
    	<bean id="testQ" class="com.lc.consumer.TestQ" />
</beans>

Java类

代码语言:javascript
复制
public class TestQ {
	private static ClassPathXmlApplicationContext context;
	
	static {
		context = new ClassPathXmlApplicationContext("file:F:/workspace1.8/sdz-web/WebContent/WEB-INF/test1.xml");
		context.start();
	}
	
	public TestQ() {
		System.out.println("TestQ构造器");
	}
	public static void main(String[] args) {
	}
}

运行结果

Bean传参赋值

Spring对象(bean)的赋值。SpringBean的属性赋值常见有两种方式property和constructor-arg,以Student类来举例。

代码语言:javascript
复制
public class Student {
	private String name;
	public Student() {}
	public Student(String name) {
		this.name = name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
property

property是set注入,实际上调用对象的set方法,配置标签是property。当找不到对应set方法时,会抛出异常:NotWritablePropertyException

代码语言:javascript
复制
<bean id=”stu” class=”com.lc.consumer.Student” >
	<property name=“name” value=”xxx”” />
</bean>

等同java代码:

代码语言:javascript
复制
Student stu = new Student();
stu.setName("xxx");
constructor-arg

constructor-arg是构造注入,实际上是构造器传参,配置标签是constructor-arg。

代码语言:javascript
复制
<bean id="stu" class="com.lc.consumer.Student">
         <constructor-arg value="xxx" />
</bean>

等同java代码:

代码语言:javascript
复制
Student stu = new Student("xxx");

同时spring支持通过factory-bean来赋值传参,下面是通过SimpleDateFormat给Date传参

代码语言:javascript
复制
<bean id="simpleDateFormat"class="java.text.SimpleDateFormat" >
         <constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="employers" class="com.lc.ioc.Employers">
         <property name="workStart" >
                   <bean factory-bean="simpleDateFormat" factory-method="parse">
                            <constructor-arg value="2016-05-18" />
                   </bean>
         </property>
</bean>

获得bean对象

通过代码获取

普通Java类中,可通过加载配置文件得到的Spring容器上下文对象获得

代码语言:javascript
复制
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml配置地址");
context.start();
Student stu = (Student)context.getBean("stu");

在web项目中,可以通过request得到Spring容器上下文对象,接着根据上下文对象过的

代码语言:javascript
复制
ServletContext sc =request.getSession().getServletContext();  
ApplicationContext ac1 =WebApplicationContextUtils .getRequiredWebApplicationContext(sc);
ac1.getBean("stu"); 
注解注入

在实际工作中一般采用零配置的方式,完成注册bean功能。将java对象前加上'@Autowired'、'@Resource'注解,会自动在Spring容器中寻找class类型相同或class类型相同id与对象属性相同的bean,并赋值。Spring注解注入不支持静态属性。

使用方法

1.添加注入配置AutowiredAnnotationBeanPostProcessor,它的作用是查找spring容器中所有的bean,如果发现bean中存在'@Autowired'、'@Resource'注解,就根据要注入class类型,首先寻找Spring容器中是否存在相同class类型的bean:

若找到在一个,便赋值,

若找到多个,则找到id与要注入的属性名相同的bean注入

若存在多个,也没有找到id与与要注入的属性名相同的bean,它会抛出异常NoUniqueBeanDefinitionException: xxx expected single matching beanbut found 2: xxx,xxx。

注意:带注入注解的类本身必须已经注册成Spring的bean。

代码语言:javascript
复制
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

2.使用扫描注入配置<context:component-scan>,它会扫描指定包下所有的类,发现类带有'@Component'、'@Service'、'@Controller'之中的一个注解时,会自动为这个类注册bean,将所有带注解的类都注册bean之后,接着去查询所有bean,寻找'@Autowired','@Resource'注解去注入。配置它可以省略AutowiredAnnotationBeanPostProcessor配置。这里也可以加上<context:exclude-filter/>、<context:include-filter />,意思是不注册某种注解的类、只注册某种注解的类。

代码语言:javascript
复制
<context:component-scanbase-package="com.lc.consumer" />

3.使用配置<dubbo:annotation>,这是dubbo的扫描标签,与<context:component-scan>功能类似,它除了会扫描带有'@Component'、'@Service'、'@Controller'注解的类之外,它还会扫描带有”@Service”(dubbo的service标签)发布服务,它支持的注入注解除了'@Autowired','@Resource'之外,还支持'@Reference'消费服务。同样,配置<dubbo:annotation>,可以不配置<context:component-scan>,如果既配置<context:component-scan >、又配置<dubbo:annotation>,也不会注册两份bean。

代码语言:javascript
复制
<dubbo:annotationpackage="com.lc.consumer" />
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring简介
  • Spring配置使用
    • 配置文件
      • 如何加载Spring配置文件
        • java类
        • web
      • Bean的构造
        • Bean传参赋值
          • property
          • constructor-arg
        • 获得bean对象
          • 通过代码获取
          • 注解注入
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档