spring

随着我们开发,发现了一个问题:
                       A---->B---->C---->D
                       在A中创建B的对象调用B的资源
                       在B中创建C的对象调用C的资源
                       在C中创建D的对象调用D的资源
                       这样的开发模式中,对象与对象之间的耦合性太高
                       造成对象的替换非常的麻烦。
                       A--->B2--->C--->D

解决:
               我们创建一个对象E,将B、C、D的示例化对象存储到E中。然后
               在A中获取E,然后通过E获取B对象。E中存储的对象需要动态的创建
               ,给E配置一个文件,用该文件配置所有需要存储在E的对的全限定路径。
               然后E的底层根据配置文件中的配置信息一次性创建好存储起来。

Spring boot

特点

1. 创建独立的Spring应用程序
2. 嵌入的Tomcat,无需部署WAR文件
3. 简化Maven配置
4. 自动配置Spring
5. 提供生产就绪型功能,如指标,健康检查和外部配置
6. 绝对没有代码生成和对XML没有要求配置

优点

spring boot 可以支持你快速的开发出 restful 风格的微服务架构

自动化确实方便,做微服务再合适不过了,单一jar包部署和管理都非常方便。只要系统架构设计合理,大型项目也能用,加上nginx负载均衡,轻松实现横向扩展

spring boot 要解决的问题, 精简配置是一方面, 另外一方面是如何方便的让spring生态圈和其他工具链整合(比如redis, email, elasticsearch)

注解和实战


@SpringBootApplication:申明让spring boot自动给程序进行必要的配置,这个配置等同于:

@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。


@Controller:用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。

@RestController:用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。

@Service:一般用于修饰service层的组件

@Repository:使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

@Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。


写bean:

public interface AlphaDao {String select();
}
@Repository("AlphaHibernate")
public class AlphaDaoHibernateImpl implements AlphaDao {@Overridepublic String select() {return "Hibernate";}
}
@Repository
@Primary
public class AlphaDaoMybatisImpl implements AlphaDao {@Overridepublic String select() {return "Mybatis";}
}

在test中通过接口类型获取bean并使用:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class CommunityApplicationTests implements ApplicationContextAware {private  ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}@Testpublic void testApplicationContext(){System.out.println(applicationContext);AlphaDao alphaDao=applicationContext.getBean(AlphaDao.class);System.out.println(alphaDao.select());alphaDao=applicationContext.getBean("AlphaHibernate",AlphaDao.class);System.out.println(alphaDao.select());}

注意,所有bean只实例化一次,这就是所谓的单例模式了。

如果不希望单例。

加注解:

@Scope("prototype")

bean中书写两个方法控制初始化和销毁时做的事:

    public AlphaService() {
//        System.out.println("实例化AlphaService");}@PostConstructpublic void init() {
//        System.out.println("初始化AlphaService");}@PreDestroypublic void destroy() {
//        System.out.println("销毁AlphaService");}
//结果:初始化、实例化、销毁

@Configuration:相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

第三方的bean:

配置

@Import:用来导入其他配置类。

import java.text.SimpleDateFormat;
@Configuration
public class AlphaConfig {@Beanpublic SimpleDateFormat simpleDateFormat(){return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}
}

使用

 @Testpublic void testBeanConfig(){SimpleDateFormat simpleDateFormat=applicationContext.getBean(SimpleDateFormat.class);System.out.println(simpleDateFormat.format(new Date()));}

依赖注入:

@AutoWired:自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

(可以写在类前或者get前,但是一般不用)

@Qualifier:当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者,具体使用方式如下:

 @Autowired@Qualifier("AlphaHibernate")private AlphaDao alphaDao;@Autowiredprivate AlphaService AlphaService;@Autowiredprivate SimpleDateFormat simpleDateFormat;@Testpublic void testDI(){System.out.println(alphaDao);System.out.println(AlphaService);System.out.println(simpleDateFormat);}

经典开发三层模型:

dao:

@Repository
public class AlphaDaoHibernateImpl implements AlphaDao {@Overridepublic String select() {return "Hibernate";}
}

service:

@Service
public class AlphaService {@Autowiredprivate AlphaDao alphaDao;public String find() {return alphaDao.select();}
}

controller

@ResponseBody:表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。

@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。

@Controller
@RequestMapping("/alpha")
public class AlphaController {@Autowiredprivate AlphaService AlphaService;@RequestMapping("data")@ResponseBodypublic String getData(){return AlphaService.find();}

springMVC


原始请求响应

    @RequestMapping("/http")public void http(HttpServletRequest request, HttpServletResponse response){System.out.println(request.getMethod());System.out.println(request.getServletPath());Enumeration<String> enumeration=request.getHeaderNames();while(enumeration.hasMoreElements()){String name=enumeration.nextElement();String value=request.getHeader(name);System.out.println(name+":"+value);}System.out.println(request.getParameter("code"));response.setContentType("text/html;charset=utf-8");try(PrintWriter writer = response.getWriter()){writer.write("<h1>橙白站</h1>");} catch (IOException e) {e.printStackTrace();}}

get

    //get//  /students?current=1&limit=20@RequestMapping(path="/students",method= RequestMethod.GET)@ResponseBodypublic String getStudents(
//默认@RequestParam(name="current",required = false,defaultValue = "1") int current,@RequestParam(name="limit",required = false,defaultValue = "10") int limit){System.out.println(current);System.out.println(limit);return "some students";}// /student/123@RequestMapping(path="/student/{id}",method= RequestMethod.GET)@ResponseBodypublic String getStudent(@PathVariable("id") int id){System.out.println(id);return "a student";}

post

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>增加学生</title>
</head>
<body><form method="post" action="/community/alpha/student"><p>姓名:<input type="text" name="name"></p><p>年龄:<input type="text" name="age"></p><p><input type="submit" value="保存"></p></form>
</body>
</html>
    //post@RequestMapping(path = "/student",method = RequestMethod.POST)@ResponseBodypublic String saveStudent(String name,int age){System.out.println(name);System.out.println(age);return "success";}

响应

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Teacher</title>
</head>
<body><p th:text="${name}"></p><p th:text="${age}"></p>
</body>
</html>
    //响应html数据@RequestMapping(path = "/teacher",method = RequestMethod.GET)public ModelAndView getTeacher(){ModelAndView mav=new ModelAndView();mav.addObject("name","张三");mav.addObject("age",30);mav.setViewName("/demo/view");return mav;}//返回模板的地址@RequestMapping(path = "/school",method = RequestMethod.GET)public String getSchool(Model model){model.addAttribute("name","北大");model.addAttribute("age","100");return "/demo/view";}

异步

    //响应json数据(异步请求中)//java对象->json字符串-> js对象@RequestMapping(path = "/emp",method = RequestMethod.GET)@ResponseBodypublic Map<String,Object> getEmp(){Map<String,Object> emp=new HashMap<>();emp.put("name","张三");emp.put("age",23);emp.put("salary",8000.00);return emp;}
    @RequestMapping(path = "/emps",method = RequestMethod.GET)@ResponseBodypublic List<Map<String,Object>> getEmps(){List<Map<String,Object>> list=new ArrayList<>();Map<String,Object>emp=new HashMap<>();emp.put("name","张三");emp.put("age",23);emp.put("salary",8000.00);list.add(emp);emp=new HashMap<>();emp.put("name","李四");emp.put("age",24);emp.put("salary",9000.00);list.add(emp);return list;}

其他注解

@EnableAutoConfiguration:SpringBoot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置你的Spring应用。例如,如果你的classpath下存在HSQLDB,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库”。你可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们。

@ComponentScan:表示将该类自动发现扫描组件。个人理解相当于,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的使用了@Service,@Repository等注解的类。

@ImportResource:用来加载xml配置文件。

@Bean:用@Bean标注方法等价于XML中配置的bean。

@Value:注入Spring boot application.properties配置的属性的值。示例代码:

@Inject:等价于默认的@Autowired,只是没有required属性;

@Bean:相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

@Resource(name=”name”,type=”type”):没有括号内内容的话,默认byName。与@Autowired干类似的事。

springboot1——spring相关入门相关推荐

  1. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  2. Spring Boot 入门

    一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...

  3. Spring Security 入门(五):在 Spring-Boot中的应用

    前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖  <parent>    <groupId>org.springframework.bo ...

  4. Spring Security入门(三):密码加密

    前文导读 - Spring Security入门(一):登录与退出 - Spring Security入门(二):基于数据库验证 Github 地址 https://github.com/ChinaS ...

  5. Spring框架入门

    目录 Spring框架概述 1.Spring框架组成 2.使用spring有什么好处 3.为什么使用spring框架 4.Spring快速入门 4.1Spring IoC底层实现原理 4.2下载Spr ...

  6. Spring Boot 入门与实战笔记

    **一.**Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 20 ...

  7. springboot 创建地址_这可能是史上最易懂的 Spring Boot 入门教程

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  8. Web应用程序中的Spring JDBC入门

    在上一篇文章中,我已经向您展示了如何设置基本的Spring 3 MVC Web应用程序 . 重复使用该项目设置作为模板,我将向您展示如何增强它以与JDBC一起使用. 有了它,您可以存储和检索数据库中的 ...

  9. Spring Cloud 入门 之 Config 篇(六)

    一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分成多个小项目做成微服务,每个微服务都会有各自配置文件,管理和修改文件起来也会变得繁琐.而且,当我们需要修改正在运行的项目的配置时 ...

最新文章

  1. 怎么样给下拉框加载背景色
  2. 4月27日云栖精选夜读丨阿里CMO董本洪:你要运营流量,更要运营超级用户
  3. 详解Kafka与ActiveMQ的区别与联系!
  4. 【C语言进阶深度学习记录】十五 编译过程简介
  5. [转]RSA算法简介
  6. python推导式pythonic必备
  7. linux下的文档处理及tar命令
  8. python微信点赞脚本_你写过的最好的 Python 脚本是什么?
  9. 面向对象之软件需求中的体系构造
  10. 12,mac phpstorm xdebug
  11. unity透明通道加颜色_关于Unity伽马校正的一点笔记
  12. 修复Lvgl的roller控件点击位置向上偏移的问题
  13. svn使用 BCompare比较工具
  14. DW——验证注册页面 设计JavaScript
  15. XCTF-高手进阶区:mfw
  16. 2K和XP的CMD命令教程(命令篇)
  17. ERROR:Xst:899--FPGA ERROR
  18. 公司网站被黑客入侵,怎么应对?
  19. Python 绘制e^x,e^-x,e^x/x,e^-x/x,e-2x/x,e^-3x/x,ln(x)图像
  20. 技术人员也要注重提升软实力

热门文章

  1. raid卡组不同raid_RAID磁盘阵列是如何运作的?
  2. 基于半同步/半反应堆线程池实现的HTTP解析服务端程序
  3. BSS段、数据段、代码段、堆与栈
  4. windows mobile 编译(生成镜像)提速
  5. Hive-Based Registry使用
  6. pyspark 修改python版本_python – Pyspark从日期到字符串更改列的类型
  7. cat 几行_迷风花说Cat!Cat因为林教练是好教练回去现实却给了一巴掌
  8. 利用python读取栅格数据
  9. 【转】新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序(续1)
  10. SharePoint2013 2019性能及限制