非法网站怎么推广,网站长尾词挖掘,北京网站制作设计公司排名,如何做网站卖东西spring
随着我们开发#xff0c;发现了一个问题#xff1a; A----B----C----D 在A中创建B的对象调用B的资源 在B中创建C的对象调用C的资源 在C中创建D的对象调用…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.applicationContextapplicationContext;}Testpublic void testApplicationContext(){System.out.println(applicationContext);AlphaDao alphaDaoapplicationContext.getBean(AlphaDao.class);System.out.println(alphaDao.select());alphaDaoapplicationContext.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 simpleDateFormatapplicationContext.getBean(SimpleDateFormat.class);System.out.println(simpleDateFormat.format(new Date()));} 依赖注入
AutoWired自动导入依赖的bean。byType方式。把配置好的Bean拿来用完成属性、方法的组装它可以对类成员变量、方法及构造函数进行标注完成自动装配的工作。当加上requiredfalse时就算找不到bean也不报错。
可以写在类前或者get前但是一般不用
Qualifier当有多个同一类型的Bean时可以用Qualifier(“name”)来指定。与Autowired配合使用。Qualifier限定描述符除了能根据名字进行注入但能进行更细粒度的控制如何选择候选者具体使用方式如下 AutowiredQualifier(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());EnumerationString enumerationrequest.getHeaderNames();while(enumeration.hasMoreElements()){String nameenumeration.nextElement();String valuerequest.getHeader(name);System.out.println(name:value);}System.out.println(request.getParameter(code));response.setContentType(text/html;charsetutf-8);try(PrintWriter writer response.getWriter()){writer.write(h1橙白站/h1);} catch (IOException e) {e.printStackTrace();}}
get //get// /students?current1limit20RequestMapping(path/students,method RequestMethod.GET)ResponseBodypublic String getStudents(
//默认RequestParam(namecurrent,required false,defaultValue 1) int current,RequestParam(namelimit,required false,defaultValue 10) int limit){System.out.println(current);System.out.println(limit);return some students;}// /student/123RequestMapping(path/student/{id},method RequestMethod.GET)ResponseBodypublic String getStudent(PathVariable(id) int id){System.out.println(id);return a student;}
post
!DOCTYPE html
html langen
headmeta charsetUTF-8title增加学生/title
/head
bodyform methodpost action/community/alpha/studentp姓名input typetext namename/pp年龄input typetext nameage/ppinput typesubmit value保存/p/form
/body
/html //postRequestMapping(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 langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleTeacher/title
/head
bodyp th:text${name}/pp th:text${age}/p
/body
/html //响应html数据RequestMapping(path /teacher,method RequestMethod.GET)public ModelAndView getTeacher(){ModelAndView mavnew 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 MapString,Object getEmp(){MapString,Object empnew HashMap();emp.put(name,张三);emp.put(age,23);emp.put(salary,8000.00);return emp;} RequestMapping(path /emps,method RequestMethod.GET)ResponseBodypublic ListMapString,Object getEmps(){ListMapString,Object listnew ArrayList();MapString,Objectempnew HashMap();emp.put(name,张三);emp.put(age,23);emp.put(salary,8000.00);list.add(emp);empnew HashMap();emp.put(name,李四);emp.put(age,24);emp.put(salary,9000.00);list.add(emp);return list;} 其他注解
EnableAutoConfigurationSpringBoot自动配置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干类似的事。