spring之ioc

简介

  1. 什么是spring,它能够做什么?
    Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
    Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
    然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
    目的:解决企业应用开发的复杂性
    功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
    范围:任何Java应用
    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
  2. 什么是控制反转(或依赖注入)
    控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的
    (依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:
    (依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
    IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中

配置spring的依赖

  • pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.javaxl</groupId>
	<artifactId>T224_spring</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>T224_spring Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<spring.version>5.0.1.RELEASE</spring.version>
		<javax.servlet.version>4.0.0</javax.servlet.version>
		<junit.version>4.12</junit.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<!-- 2、导入spring依赖 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- 5.1、junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		<!-- 5.2、servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${javax.servlet.version}</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	<build>
		<finalName>T224_spring</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

spring管理Bean的方式

  1. set注入
  • 基本数据类型
  • 引用数据类型
  1. 构造注入
  2. 自动装配
  • UserAction


/**
 * 弊端: 
 * 	当需求变化非常快的时候,不便于维护,因为维护的权利是属于程序员的
 * 
 * spring的ioc就是解决这一问题的
 * 	将维护代码的权利由程序员转交给spring容器来完成
 * 
 * 1、spring管理Bean的方式(注入方式)
 * 	set注入
 * 		基本数据类型
 * 		引用数据类型
 *  构造注入
 *  自动装配
 * @author 林凡
 *
 */
public class UserAction {
//	private UserBiz userBiz =new UserBizImpl2();//实例任意类方法
	private UserBiz userBiz;
	private int uid;
	private String uname;
	private List<String> hobby =new ArrayList<String>();
	
	/**
	 * set注入方法
	 * @return
	 */
	
	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}
	public List<String> getHobby() {
		return hobby;
	}
	public void setHobby(List<String> hobby) {
		this.hobby = hobby;
	}

	
	/**
	 * 构造注入方法
	 * @param uid
	 * @param uname
	 */
	
	public UserAction() {
	}
	public UserAction(int uid, String uname, List<String> hobby) {
		super();
		this.uid = uid;
		this.uname = uname;
		this.hobby = hobby;
	}

	/**
	 * 引用数据类型
	 * @return
	 */
	public UserBiz getUserBiz() {
		return userBiz;
	}
	public void setUserBiz(UserBiz userBiz) {
		this.userBiz = userBiz;
	}
	
	/**
	 * set 注入
	 */
	public void test1() {
		System.out.println("sid:"+this.uid);
		System.out.println("uname:"+this.uname);
		System.out.println("hobby:"+this.hobby); 
	}
	
	/**
	 * 构造注入
	 */
	public void test2() {
		
	}
	
	/**
	 * 注入引用数据类型
	 */
	public void test3() {
		userBiz.read();
		//调用的是继承实例化的方法
	}
}

  • spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.3.xsd"
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans" >

	<!--配置的是改要实例类的全路径UserImpl1  -->
	<!--如果自动配置的话就直接加上 default-autowire="byType" 就不需要写配置属性值了 但是就只能写一个配置   -->
	<!-- 若加上default-autowire="byName"就能写多个配置也只会根据名字的id来输出值或者方法。  -->
	<bean id="userBiz" class="com.ioc.biz.impl.UserBizImpl2" ></bean>
	<!-- <bean id="userBiz1" class="com.ioc.biz.impl.UserBizImpl1" ></bean> -->
	<bean id="userAction" class="com.ioc.web.UserAction">
		<!--配置继承方法的父类userBiz  -->
		<property name="userBiz" ref="userBiz" ></property>
		
		<!-- set注入方法 -->
		<!-- <property name="uid" value="22"></property>
		<property name="uname" value="zs"></property>
		<property name="hobby">
			<list>
				<value>篮球</value>
				<value>rap</value>
				<value>123</value>
			</list>
		</property> -->
		
		<!--构造注入方法  -->
	<constructor-arg name="uid" value="22"></constructor-arg>	
	<constructor-arg name="uname" value="aa" ></constructor-arg>
	<constructor-arg name="hobby">
			<list>
				<value>篮球</value>
				<value>rap</value>
				<value>123</value>
			</list>
	</constructor-arg>
	
	</bean>

</beans>

测试代码

  • Demo1
public class Demo1 {
   public static void main(String[] args) {
//获取文件中的内容spring-context.xml的内容
//		ApplicationContext context =new ClassPathXmlApplicationContext("/spring-context.xml");
//		UserAction bean =(UserAction)context.getBean("userAction");
//		bean.test1(); //set 注入
//		bean.test2();//构造注入
//		bean.test3();/这个方法能执行出了来引用类型方法
   	}
   }

tomcat管理spring

-SpringLoadListenter.java

/**
 * 2、如何将spring的上下文交给tomcat上下文进行管理
 * 首先spring上下文为什么tomcat?
 * 分析:目前工程中的所有请求javabean都交给了spring进行管理,那么浏览器发送请求,请求的tomcat,
 * 由tomcat来处理请求,tomcat处理请求一般来说都是访问数据库,数据库说由Dao曾访问的Dao层的实体类
 * 又是交给了spring的上下文管理,那就意味着,tomcat要处理请求,必须拿到spring的上下文,才能够拿到
 * Dao层的javabean
 * 
 * @author 林凡
 *
 */

@WebListener
public class SpringLoadListenter implements ServletContextListener {
	private String springXmlLocation ="";
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("监听了tomcat的启动。。。");
		ServletContext servletContext =sce.getServletContext();
		springXmlLocation = servletContext.getInitParameter("springXmlLocation");
		if(null ==springXmlLocation || "".equals(springXmlLocation)) {
			springXmlLocation ="/spring-context.xml";
		}
		System.out.println("springXmlLocation:"+springXmlLocation);
		ApplicationContext context =new ClassPathXmlApplicationContext("/spring-context.xml");
		servletContext.setAttribute("spring_context_key", context);
		
	}
}
  • 需要配置的web.xml
<!-- 第二步修改web.xml由2.33.0 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
 	 <param-name>springXmlLocation</param-name>
 	 <param-value>/spring-other.xml</param-value>
  </context-param>
  
</web-app>
  • 在UserServlet中调用运行配置

@WebServlet("/user")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletContext servletContext =req.getServletContext();
		ApplicationContext context = (ApplicationContext) servletContext.getAttribute("spring_context_key");
		
		UserAction bean =servletContext.getBean("userAction");
		bean.test3();
		
	}
}
  • 配置要监听的方法spring-other.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.3.xsd"
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.springframework.org/schema/beans" >

<bean id="userBiz" class="com.ioc.biz.impl.UserBizImpl2" ></bean>
<bean id="userAction" class="com.ioc.web.UserAction">
	<property name="userBiz" ref="userBiz" ></property>
	</bean>
</beans>
训练数据保存为deep_convnet_params.pkl,UI使用wxPython编写。卷积神经网络(CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,在计算机视觉、语音识别、自然语言处理等多个领域有广泛应用。其核心设计理念源于对生物视觉系统的模拟,主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。 **1. 局部感知与卷积操作** 卷积层是CNN的基本构建块,使用一组可学习的滤波器对输入图像进行扫描。每个滤波器在图像上滑动,以局部区域内的像素值与滤波器权重进行逐元素乘法后求和,生成输出值。这一过程能够捕获图像中的边缘、纹理等局部特征。 **2. 权重共享** 同一滤波器在整个输入图像上保持相同的权重。这显著减少了模型参数数量,增强了泛化能力,并体现了对图像平移不变性的内在假设。 **3. 池化操作** 池化层通常紧随卷积层之后,用于降低数据维度并引入空间不变性。常见方法有最大池化和平均池化,它们可以减少模型对微小位置变化的敏感度,同时保留重要特征。 **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起。随着网络深度增加,每一层逐渐提取更复杂、更抽象的特征,从底层识别边缘、角点,到高层识别整个对象或场景,使得CNN能够从原始像素数据中自动学习到丰富的表示。 **5. 激活函数与正则化** CNN中使用非线性激活函数来引入非线性表达能力。为防止过拟合,常采用正则化技术,如L2正则化和Dropout,以增强模型的泛化性能。 **6. 应用场景** CNN在诸多领域展现出强大应用价值,包括图像分类、目标检测、语义分割、人脸识别、图像生成、医学影像分析以及自然语言处理等任务。 **7. 发展与演变** CNN的概念起源于20世纪80年代,其影响力在硬件加速和大规模数据集出现后真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构推动了CNN技术的快速发展。如今,CNN已成为深度学习图像处理领域的基石,并持续创新。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值