Spring的"两个蝴蝶飞,你好"的简单开发(一)

简介: Spring的"两个蝴蝶飞,你好"的简单开发(一)

一. 为什么学习Spring

Spring 是一个开源的框架,是一个分层的一站式轻量级开源框架。 核心是 IOC (控制反转) 和AOP (面向切面)。


1.方便解耦,简化开发。

将对象的创建和依赖关系的维护,交给Spring管理。

2.AOP编程的支持

可以方便的对程序进行权限拦截,运行监控,日志等功能

3.声明式事务的支持

只需要通过简单的配置,就可以完成对数据库事务的管理,而不需要手动编程。

4.方便程序的测试

对Junit4 的支持,可以通过注解方便的测试Spring 程序。

5.方便集合各种优秀的框架。

内部提供了对Struts2 ,Hibernate,MyBatis Quartz的直接支持。

6.降低了 Java API的难度封装。

对Java中的JDBC,JavaMail,远程调用等进行了封装,使API应用难度大大降低。

7.Spring 的源码是学习的经典的范例,里面大量的设计模式和代码技巧。


二. Spring的下载


进行Spring 的官网,选择Spring FrameWork 板块进行下载,点击Learn ,就可以出现Spring 的各个版本链接,点击下载即可。


20190411195715935.png


或者直接进入Spring 的版本历史下载地址:

http://repo.springsource.org/libs-release-local/org/springframework/spring

下载后的文件夹如下所示:


20190413150230949.png


docs 为使用文档,里面放置了API 的帮助文档, libs 放置的是运行库, schema 放置了约束。 其中libs 放置的库是三个一组。


20190413150332789.png


没有任何后缀的是运行包,-javadoc 是帮助文档, -sources 是源码。 在使用时,只需要把.jar 单独拿出来即可,引用一些常见的jar 包。


基础包有:


20190413150550522.png


三. Spring以前开发的方式


三.一 创建一个简单的Person 类


在最开始的时候,是将对象的创建直接写入到程序中。


public Person getPerson(){
  Person p=new Person();
}


三.二 具有子类


Person 是一个抽象类,有两个具体的子类。 Student 和Teacher .

创建Student的时候


Public Person getStudent(){
    return new Student();
}


创建教师的时候


Public Person getTeacher(){
  return new Teacher();
}


后来,在工厂设计模式的时候,需要将一个标识传递进来,


public Person getPerson(String name){
    if("student".equals(name)){
      return new Student();
    }else if("teacher".equals(name)){
      return new Teacher();
    }
}


而这个标识,希望是动态的,即可以从配置文件,xml,properties ,或者是注解中读取出来,这样就可以动态的创建对象了。


三.三 工厂+反射+配置文件


//1. 在配置文件中,进行相应的配置, class 对应具体的全限定类名称
<bean id="student" class="com.yjl.pojo.Student"> 
//2 创建工厂
public BeanFactory{
    public Person getPerson(String id){
      Class class=Class.forName(id);
      return class.newInstance();
    }
}
//3 取得Bean
Person p=BeanFactory.getPerson("student");


传入的是一个student, 先找配置文件,找到了对应的全限定名称 Student, 这样知道创建的是一个Student 类,再利用反射机制,进行创建,返回Student 的对象。


三.四 面向接口编程


上面是面向类,具体的类进行的编号。 实际中,是利用面向接口进行相应的编号的。


PersonDao personD=new PersonDao();


后来是:


PersonDao personD=new StudentDaoImpl();


后来是:


public getPersonDao(String name){
  if("student".equals(name)){
    return new StudentDaoImpl();
  }
}


再后来:


//1. 在配置文件中,进行相应的配置, class 对应具体的全限定类名称
<bean id="studentDao" class="com.yjl.dao.StudentDaoImpl"> 
//2 创建工厂
public BeanFactory{
    public Person getPersonDao(String id){
      Class class=Class.forName(id);
      return class.newInstance();
    }
}
//3 取得Bean
PersonDao pd=BeanFactory.getPerson("studentDao");


后面会有具体的例子进行说明。


四 Spring的"两个蝴蝶飞,你好"的简单开发


四.一 创建POJO简单类


package com.yjl.pojo;
/**
 @author:yuejl
 @date: 2019年4月13日 下午3:29:48
 @Description spring的一个简单的类
*/
public class Person {
  /**
   * @param name 名称
   * @param description 描述
   */
  private String name;
  private String description;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public String say(){
    return this.name+":"+this.description;
  }
}


四.二 以前的实例化方式


@Test
  public void test1(){
    Person person=new Person();
    person.setName("两个蝴蝶飞");
    person.setDescription("一个充满希望的程序员");
    System.out.println(person.say());
  }


20190413154101166.png


四.三 导入jar 包


导入基本的这些Spring 的jar包,添加到classpath 中。


20190413154316815.png


四.四 创建spring的配置文件 applicationContext.xml


在src下创建spring的配置文件 appicationContext.xml, 名称一般命名为applicationContext.xml, 但并不是默认为applicationContext.xml 。 也可以用其他的文件名,如常见的beans.xml 。


<?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">
  <!-- id是不能重复的,且最好见名知意   class为全限定名称 -->
  <bean id="person" class="com.yjl.pojo.Person"></bean>
</beans>


约束,其他还有很多,这里只导入一个最需要的 beans.xml


四.五 Spring 方式的创建


@Test
  public void test2(){
    // 即使名称是applicationContext.xml, 也要填入相应的参数值。 而不是不传参数,默认找applicationContext.xml
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    // 具体类是如何使用的,后面解释。
    Person person=(Person) applicationContext.getBean("person");
    person.setName("两个蝴蝶飞");
    person.setDescription("一个充满希望的程序员");
    System.out.println(person.say());
  }


20190413154618266.png


可以查看其构造方法

不传的话,不做处理。


20190413154801622.png


传入一个值的话,内部处理成数组。


20190413154839299.png


传入多个值,用的是可变参数接收,所以用"," 进行隔开


20190413154932951.png


即:


ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml","beans.xml");


而Hibernate 是采用的默认,其形式为:


20190413155334388.png


五 Spring 面向接口编程


五.一 定义PersonDao的接口


package com.yjl.dao;
import com.yjl.pojo.Person;
/**
 @author:yuejl
 @date: 2019年4月13日 下午3:54:47
 @Description 类的相关描述
*/
public interface PersonDao {
  public Person getPersonByName(String name);
}


五.二 定义PersonDaoImpl实现


package com.yjl.dao;
import com.yjl.pojo.Person;
/**
 @author:yuejl
 @date: 2019年4月13日 下午3:56:33
 @Description 类的相关描述
*/
public class PersonDaoImpl implements PersonDao{
  @Override
  public Person getPersonByName(String name) {
    System.out.println("查询一个名称");
    if("两个蝴蝶飞".equals(name)){
      Person person=new Person();
      person.setName("两个蝴蝶飞");
      person.setDescription("一个充满希望的程序员");
      return person;
    }else{
      return null;
    }
  }
}


五.三 在applicationContext.xml中添加bean


<bean id="personDao" class="com.yjl.dao.PersonDaoImpl"></bean>


五.四 Spring创建接口


@Test
  public void test3(){
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    PersonDao personD=(PersonDao) applicationContext.getBean("personDao");
    Person p=personD.getPersonByName("两个蝴蝶飞");
    System.out.println(p.say());
  }


运行生成


20190413160422183.png


将personDao 改成其他的名称,如personDao1


@Test
  public void test4(){
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    PersonDao personD=(PersonDao) applicationContext.getBean("personDao1");
    Person p=personD.getPersonByName("两个蝴蝶飞");
    System.out.println(p.say());
  }


20190413160538908.png


不能够创建PersonDaoImpl 对象,说未定义。

将查询的关键字改变,成"两个蝴蝶飞1"


@Test
  public void test5(){
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    PersonDao personD=(PersonDao) applicationContext.getBean("personDao");
    Person p=personD.getPersonByName("两个蝴蝶飞1");
    System.out.println(p.say());
  }


20190413160702642.png


201904131607220.png


六. log4j.properties 的引入


上面运行的过程中,一直有警告,说log4j 未引入。


从hibernate中找到log4j.properties,进行相应的引入,放置在src目录下,与applicationContext.xml 文件同级。


20190413161041439.png


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
// 注意这一行,设置相应的级别
log4j.rootLogger=debug, stdout


再次运行,

不弹出warn ,改成info 了,那是因为log4j.properties 级别设置的是debug,默认的。


20190413161353678.png


是运行的过程。

将级别改成info。


20190413161104321.png


谢谢!!!

相关文章
|
1月前
|
安全 数据可视化 Java
AiPy开发的 Spring 漏洞检测神器,未授权访问无所遁形
针对Spring站点未授权访问问题,现有工具难以检测如Swagger、Actuator等组件漏洞,且缺乏修复建议。全新AI工具基于Aipy开发,具备图形界面,支持一键扫描常见Spring组件,自动识别未授权访问风险,按漏洞类型标注并提供修复方案,扫描结果可视化展示,支持导出报告,大幅提升渗透测试与漏洞定位效率。
|
6月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
6月前
|
前端开发 Java UED
从基础到进阶:Spring Boot + Thymeleaf 整合开发中的常见坑与界面优化
本文深入探讨了 **Spring Boot + Thymeleaf** 开发中常见的参数绑定问题与界面优化技巧。从基础的 Spring MVC 请求参数绑定机制出发,分析了 `MissingServletRequestParameterException` 的成因及解决方法,例如确保前后端参数名、类型一致,正确设置请求方式(GET/POST)。同时,通过实际案例展示了如何优化支付页面的视觉效果,借助简单的 CSS 样式提升用户体验。最后,提供了官方文档等学习资源,帮助开发者更高效地掌握相关技能。无论是初学者还是进阶用户,都能从中受益,轻松应对项目开发中的挑战。
276 0
|
4月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
482 0
|
4月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
663 0
|
6月前
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
1564 9
|
6月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。

热门文章

最新文章