网站系统升级,软件开发包括哪些,新东方烹饪学校学费一年多少钱,网站正能量晚上在线观看视频侧重于服务端#xff08;后端#xff09;#xff0c;不在意前端#xff0c;了解一些前端即可#xff09; 技术架构 #xff08;把Spring设计的更简单好用了就是Spring Boot#xff09;
开发环境#xff08;Maven#xff09; Maven
maven通过brew安装的目录为#x…侧重于服务端后端不在意前端了解一些前端即可 技术架构 把Spring设计的更简单好用了就是Spring Boot
开发环境Maven Maven
maven通过brew安装的目录为
/opt/homebrew/Cellar/maven/3.9.6/libexec构建maven项目编译时显示版本太低有以下地方排查 在pom.xml中添加如下内容强制设置JDK版本 buildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/versionconfigurationsource17/sourcetarget17/target/configuration/plugin/plugins/build设置-编译器-Java编译器 - 文件-项目结构maven仓库搜索mvnrepository.com
在上面找包复制下载语句到pom.xmlmaven就会自动下载包
Spring Initializer
目的整合不同功能的jar包方便添加生成加包语句地址https://start.spring.io/在IDEA中也可以直接创建new project-spring initializer 还有一个AOP不知为何搜不到了
然后得到一个压缩包解压后在IDEA中打开就是类似的Maven项目可以手动添加AOP
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency点击运行main后访问localhost:8080就可以看到错误界面这是正常的。springboot以jar包 的方式内嵌了Tomcat。
Spring Boot的核心功能
起步依赖pom.xml、自动配置、端点监控
写一个简单的呈现文本的处理客户端请求界面
在以下路径添加一个包再添加一个类 内容如下注解什么的之后会说
package com.newcoder.community.controler;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//import这些才能使用指定的注解Controller
RequestMapping(/alpha)
public class AlphaController {RequestMapping(/hello)ResponseBodypublic String sayHello() {return Hello Spring Boot.;}}
重启后访问localhost:8080/alpha/hello就可以看到对应的界面。
修改端口和默认上下文路径 在这里输入
server.port8888
server.servlet.context-path/community把端口移到8888默认上下文路径community
此时访问http://localhost:8888/community/alpha/hello即可看到内容 Spring全家桶 后面两个基本用不上
Spring Framework AOP面向切面编程与面向对象思想相补充data access访问数据库web servletweb开发Integration集成
Spring IoC
Inversion of Control
控制反转是一种面向对象编程的设计思想。
• Dependency Injection
依赖注入是IoC思想的实现方式。
• IoC Container
IoC容器是实现依赖注入的关键本质上是一个工厂。
注解SpringBootApplication和配置类
为什么运行SpringApplication.run(CommunityApplication.class, args); 就可以启动Tomcat服务器以及完成一些其他复杂的设置
因为添加了SpringBootApplication注解实际上这包含了好几个元注解 SpringBootConfiguration标记一个类作为配置类定义 Spring 的 Bean。EnableAutoConfiguration启用 Spring Boot 的自动配置机制。ComponentScan启用组件扫描这样你写的其他类上的 Spring 注解就会生效。让 Spring Boot 找到并注册所有的 Spring 组件包括 Component、Controller、Service、Repository 等等。(也就是添加了这些注解的bean才会被扫描 这个位于就是配置类
SpringBootApplication
public class CommunityApplication {public static void main(String[] args) {SpringApplication.run(CommunityApplication.class, args);//自动创建Spring容器扫描所有的bean创建bean的实例管理bean的生命周期}
}如何在test中使用配置类 使用ContextConfiguration(classes CommunityApplication.class)注解 这里的class不能漏回想之前的反射的知识。
具体例子来说明IoT编程的解耦合
在com.nowcoder.community下创建一个包dao用于管理数据库并在其中创建一个接口AlphaDao面向接口的编程思想随便定义一个方法返回字符串。 假设我们现在用Hibernate管理数据库那就创建一个对应的类来实现这个接口
package com.newcoder.community.dao;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Repository;Repository
public class AlphaDaoHibernateImpl implements AlphaDao{Overridepublic String select() {return Hibernate;}
}
这里注意要加Repository注解才能被Spring的容器扫描为Bean。
然后我们现在想在CommunityApplicationTests里面调用这个方法。
让该类实现ApplicationContextAware接口这样才能使其实现类访问Spring的ApplicationContext。ApplicationContext是Spring的中心接口它提供了访问应用程序配置信息的方式例如获取bean。实现这个接口那么必须实现接口中的所有抽象方法不然就要设置为抽象类这里必须实现setApplicationContext方法对ApplicationContext进行设置在类里生命一个ApplicationContext对象并赋值就可以了 private ApplicationContext applicationContext;Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;}创建函数testApplicationContext()在其中调用applicationContext.getBean取bean然后调用select方法
SpringBootTest
ContextConfiguration(classes CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {Testpublic void testApplicationContext() {AlphaDao ad applicationContext.getBean(AlphaDao.class);//为什么要getBean而不是直接实例化String s ad.select();System.out.println(s);}private ApplicationContext applicationContext;Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext applicationContext;}
}此时AlphaDao接口只有一个实现类因此不会报错且输出Hibernate。
增加需求假如此时又实现了一个类使用MyBatis操作数据库
Repository
Primary
public class AlphaDaoMybatisImpl implements AlphaDao{Overridepublic String select() {return Mybatis;}
}此时AlphaDao接口有两个实现类了直接运行肯定会报错解决方法就是
在要用的实现类上加上Primary注解表明优先级
增加需求了现在仍然有人想要用Hibernate那个实现类怎么做 指定bean Repository注解可以添加参数比如
Repository(alphaHibernate)就是给这个bean取个名字然后把test中的getBean的部分改成
public void testApplicationContext() {AlphaDao ad (AlphaDao) applicationContext.getBean(alphaHibernate);//为什么要getBean而不是直接实例化String s ad.select();System.out.println(s);}这里返回的本来是Object类型这里需要强转成AlphaDao或者加个参数 Testpublic void testApplicationContext() {AlphaDao ad applicationContext.getBean(alphaHibernate,AlphaDao.class);//为什么要getBean而不是直接实例化String s ad.select();System.out.println(s);}这时打印的就是AlphaDao Hibernate了
其他管理Bean的方法
需求观察容器对Bean进行自动生命周期的管理
重新创建一个包service管理业务组件并创建AlphaService类编写构造器初始化和销毁函数
public class AlphaService {public AlphaService() {System.out.println(构造器被实现了);}PostConstructpublic void init(){System.out.println(初始化 AlphaService);}PreDestroypublic void destroy(){System.out.println(销毁 AlphaService);}}PostConstruct注解该函数表示在构造函数后执行PreDestroy表示在销毁函数前执行。
运行tests类编写测试函数 Testpublic void testBeanManagement(){AlphaService as applicationContext.getBean(AlphaService.class);System.out.println(as);}运行结果 可见每个被Spring管理Bean只有一个实例是单例模式。只示例化一次如果不想就在bean上加注解Scope(“prototype”)不常用不要用
装配第三方jar包中的bean
需求装载第三方的SimpleDateFormat类。
在com.nowcoder.commuity下创建一个配置包config并在其冲创建AlphaConfig配置类
Configurationpublic class AlphaConfig {Beanpublic SimpleDateFormat simpleDateFormat(){//方法名就用要用的bean的小驼峰return new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);}}配置类加Configuration注解不用加SpringConfiguration一般一个项目只有一个要用的bean加Bean注解方法名就用要用的Bean的小驼峰
创建测试方法运行 Testpublic void testBeanConfig(){SimpleDateFormat sdf applicationContext.getBean(SimpleDateFormat.class);System.out.println(sdf.format(new Date()));}运行后就会打印当前日期。
Spring的依赖注入
常用不用直接getBean直接使用Autowired注解
Autowired
private AlphaDao alphaDao;Test
public void testDI(){System.out.println(alphaDao);
}这里注意一个问题在运行testDI的时候AlphaService的构造器等也运行了 在Spring框架中当ApplicationContext启动或刷新时它会创建所有的singleton bean。在你的代码中AlphaService被标注为Service这意味着它是一个Spring管理的bean并且默认情况下它的作用域是singleton。这就是为什么当你运行testDI测试方法时AlphaService的构造函数也会被执行。所以当ApplicationContext启动时它就会被创建。这就是为什么你会看到构造器被实现了的输出即使你并没有直接使用AlphaService。 如果需要指定Bean添加Qualifier注解
Autowired
Qualifier(alphaHibernate)
private AlphaDao alphaDao;Test
public void testDI(){System.out.println(alphaDao);
}实际应用开发中 不同的包相互调用可用上面的方法进行依赖注入。