提交 57c110af 编写于 作者: W wizardforcel

Merge branch 'master' of https://github.com/apachecn/jtn-zh

......@@ -12,7 +12,7 @@
## 项目描述
我们将创建一个简单的 Web 应用程序,其中包含一个注册表格,一个登录表格和一个私人页面。 用户登录后即可访问该私人页面。 表单中的所有字段都将根据错误的用户输入进行验证。
我们将创建一个简单的 Web 应用程序,其中包含一个注册表单,一个登录表单和一个私人页面。 用户登录后即可访问该私人页面。 表单中的所有字段都将根据错误的用户输入进行验证。
## 创建数据库表
......@@ -26,7 +26,7 @@
* 密码– SHA-256 编码的用户密码。 切勿将用户密码存储为纯文本格式-不好😉
* 名称–用户名
Glassfishe 的安全领域只有用户名和密码字段为必填项。 我在此处添加了名称,以说明您可以在同一表中为用户添加其他信息
Glassfishe 的安全领域只有用户名和密码字段为必填项。 我在此处添加了名称,以说明您可以在同一表中为用户添加其他信息
```java
CREATE TABLE `users` (
......@@ -58,7 +58,7 @@ CREATE TABLE `user_groups` (
您可以在 GitHub 上找到完整的源代码,网址为 [https://github.com/JavaTutorialNetwork/Tutorials/tree/master/GlassfishFormBasedAuthentication](https://github.com/JavaTutorialNetwork/Tutorials/tree/master/GlassfishFormBasedAuthentication)
## 项目依赖关系(pom.xml 文件)
## 项目依赖关系(`pom.xml`文件)
这是纯 Java EE 7 的实现,除了 Java Enterprise API 本身之外,我们在项目中不需要其他依赖项。 该 API 已包含在 Glassfish 中,因此您应将依赖项标记为`provided`
......@@ -251,7 +251,7 @@ public class Group implements Serializable {
字段`groupname`用于给定用户角色。 该表是一个映射表,用户 ID 映射到某个角色。 为了使此示例简单,在本教程中创建的所有帐户都将具有“用户”角色。 您可以根据需要添加更多角色。 角色不是预定义的,您可以随意命名。 角色之间的区别在于实现。 例如,如果您具有“管理员”角色,则将要赋予它比“用户”更多的特权。 您必须以编程方式限制一个角色,并以编程方式为另一个角色提供更多选择,并在您自己的代码中进行管理。
## persistence.xml 文件
## `persistence.xml`文件
```java
<?xml version="1.0" encoding="UTF-8"?>
......@@ -299,7 +299,7 @@ public class Group implements Serializable {
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
```
## 编写业务层– UserEJB
## 编写业务层 – `UserEJB`
在这一步中,我们将编写一个 Enterprise Java Bean(EJB),以在数据库中插入新用户并对其进行查询。 EJB 通常用作持久层(数据库实体)和表示层(托管 Bean 和 JSF 页面)之间的中介。
......@@ -427,7 +427,7 @@ Glassfish 服务器配置安全领域
* **摘要算法** – SHA-256
* **编码** – Base64
## glassfish-web.xml 文件
## `glassfish-web.xml`文件
```java
<?xml version="1.0" encoding="UTF-8"?>
......@@ -449,7 +449,7 @@ Glassfish 服务器配置安全领域
我们必须在`glassfish-web.xml`文件中指定`security-role-mapping`,并添加角色名称和组名称
## web.xml 文件
## `web.xml`文件
```java
<?xml version="1.0" encoding="UTF-8"?>
......@@ -536,15 +536,15 @@ web.xml 部署描述符也需要进行一些更改。 我们将在此处配置
`&lt;security-constraints&gt;`标签中,我们为特定用户角色定义了受限资源。 换句话说– `user`目录中的每个文件都需要登录才能访问。 我们将在其中放置私有 XHTML 文件。
## 创建示层
## 创建示层
![Registration form](img/0c3808c455e96f9b6cc17ae1a64b8184.jpg)
报名表格
注册表单
### 注册表表格页面
### 注册表页面
在注册表中,我们要求提供用户名,电子邮件地址和密码。 我们还要求用户确认密码。 我们将验证电子邮件,密码和确认密码字段中的用户输入。
在注册表中,我们要求提供用户名,电子邮件地址和密码。 我们还要求用户确认密码。 我们将验证电子邮件,密码和确认密码字段中的用户输入。
首先让我们看一下 JSF XHTML 文件和 Managed Bean
......@@ -823,7 +823,7 @@ if (userEJB.findUserById(email) != null) { // email is already used }
## 成功注册
如果用户在注册表中输入正确的数据,则将创建一个新的`User`对象并将其插入数据库中。
如果用户在注册表中输入正确的数据,则将创建一个新的`User`对象并将其插入数据库中。
```java
User user = new User(email, password, name);
......@@ -871,13 +871,13 @@ regdone.xhtml 页面
</html>
```
## 登录表
## 登录表
在此表中,我们需要用户的电子邮件地址和密码。 表单针对空白字段进行了验证。 在`LoginView`中检查用户名和密码的有效性。
在此表中,我们需要用户的电子邮件地址和密码。 表单针对空白字段进行了验证。 在`LoginView`中检查用户名和密码的有效性。
![Login form](img/5528420612ad56473a4881c1a3c8f87d.jpg)
登录表
登录表
如果用户输入了有效的登录数据,则会创建一个新的`java.security.Principal`对象。 我们还将用户添加到`externalContext`的会话地图中
......
......@@ -26,7 +26,7 @@
使用 SPA 确实有一些弊端,例如 SEO 变得有些难以管理,但是在完成应用程序后,我们将讨论如何解决该问题。 今天要使用的框架是著名的 Angular。
## 为什么要成角度
## 为什么要 Angular
好吧,您可能想知道为什么每个人都对 Angular 狂热。 毕竟,目前的排名表明 Angular 是 JS 框架王国的统治者。 它是迄今为止使用最广泛的框架,并且拥有最大的社区之一和大量文档。 Angular 允许我们使用双向数据绑定来构建动态 Web 应用程序。 在电子商务网站上浏览时,您不想每次签出新产品或同一产品的其他版本时都重新加载页面,而 Angular 允许您这样做。 它也很容易构建和调试,因此使用 Angular 可以使测试变得更加容易,这是 Web 开发的核心步骤。 为此,互联网上有许多 [Angular 教程](https://hackr.io/tutorials/learn-angular)和课程,可以从中找到基本信息。
......@@ -64,7 +64,7 @@ HTML 文件中没有太多代码,这使 Angular 相当有效。 Angular 拥有
![Angular HTML file](img/5127732c53803d1698584f04078ec531.jpg)
角度 HTML 文件
Angular HTML 文件
现在剩下的唯一事情就是制作一个 Javascript 文件,将所有内容整合在一起。
......@@ -72,13 +72,13 @@ Javascript 文件将定义客户端行为,并使用我们之前创建的 REST
![Angular code](img/bd62942479fa605bf6cc265d567d1500.jpg)
角度代码
Angular 代码
## 角度 SEO 优化
## Angular SEO 优化
SPA 的核心问题之一是 SEO 优化,这对于某些 SPA 的成功至关重要。 Google 在抓取 Javascript 内容时遇到了问题,尽管他们正在努力,但它还不完全兼容 JS。 有多种方法可以解决此问题,可以手动或使用自定义服务。 这个想法是从您的应用程序创建一个 HTML 快照以直接提供给搜寻器,而不是希望它可以正确理解和索引您的 Angular 代码。 如果您无法手动完成任务,也可以减轻压力,则可以使用预渲染平台来完成任务。 您还可以执行一些辅助操作,例如获取有意义的 URL 名称而不是随机生成的 URL 名称。 维护用户友好的 URL 会反过来给您的用户和应用程序增加很多。 您应该使用一些工具来监视 SPA 的性能,并监视所有需要的更改。
## 摘要
## 总结
回顾一下,我们首先通过 Java Persistence API 构建数据库,然后创建了 Java 资源类以作为 REST 服务访问数据库,尽管这里我们仅演示了 GET 方法。 在完成了后端之后,我们继续进行前端,我们创建了 HTML 组件文件,这要归功于 AngularJS,它非常简单明了。 最后,Javascript 文件将所有内容组合在一起,为应用程序注入了生命。
......
# 弹簧
\ No newline at end of file
# Spring
\ No newline at end of file
......@@ -4,7 +4,7 @@
在本文中,我将解释 Spring Framework 背后的关键概念以及如何进一步使用它来构建 Web 应用程序。
## ![](img/d2f73752d8ae931b119dec1eac866973.jpg)
![](img/d2f73752d8ae931b119dec1eac866973.jpg)
## 什么是 Spring Framework?
......
......@@ -14,7 +14,7 @@
* 优化基础设施
* 将应用程序及其依赖项打包到标准化单元中
## 货柜
## 容器
不,我不是在谈论现实世界中的容器。 但是,既然您正在考虑它,我不妨作个比喻。 现实生活中的容器的目的是存储需要运输到另一个地方的货物或物品。 现在,这些商品具有不同的存储要求,例如,可能存在牛奶的有效期比例如西红柿短的牛奶。 这就是为什么在现实生活中容器是非常有用的原因–容器保留了内部环境,例如敏感商品和/或物品的温度。 话虽如此,运输业不必担心这些物品,而将重点放在将它们从 A 运送到 B 上。
......
......@@ -16,7 +16,7 @@
当您要“声明”一个类作为控制器时,就像使用 @Controller 对其进行注释一样简单。 在类级别使用时,控制器现在可以处理 REST API 请求。
### GetMapping 注解
### `GetMapping`注解
当使用 @Controller 注解时,可以通过使用该方法的 RequestMapping 注解来提供请求映射。 还有 @ RequestMapping,@ PostMapping,@ PutMapping 可以简化常见 HTTP 方法类型的映射。
......
# Spring 中的 PathVariable 注释
# Spring 中的`PathVariable`注解
> 原文: [https://javatutorial.net/pathvariable-annotation-in-spring](https://javatutorial.net/pathvariable-annotation-in-spring)
......@@ -6,7 +6,7 @@
![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)
### 例
###
假设您有一个支持以下 URL 的网站:
......@@ -64,7 +64,7 @@ public class EmployeeManager {
1. 方法参数使用相同的名称
2. 在@PathVariable 注解中指定模板变量的名称
### 多个@PathVariable 注解
### 多个`@PathVariable`注解
如果您可以有多个@PathVariable,该怎么办? 我们可以做到吗? 我们可以! 实际上,这与添加单个@PathVariable 非常相似。
......@@ -89,7 +89,7 @@ public class EmployeeManager {
然后,我们提取每个模板变量,然后通过指定方法参数所引用的临时变量将它们“分配”给方法参数。
## @PathVariable vs @RequestParam 结论
## `@PathVariable` vs `@RequestParam`结论
尽管@PathVariable 和@RequestParam 都用于从 URL 提取值,但是可以根据 URL 的设计使用它们。
......
# Spring 中的 RequestBody 注释
# Spring 中的`RequestBody`注解
> 原文: [https://javatutorial.net/requestbody-annotation-in-spring](https://javatutorial.net/requestbody-annotation-in-spring)
......
# Spring 中的 RequestParam 注释
# Spring 中的`RequestParam`注解
> 原文: [https://javatutorial.net/requestparam-annotation-in-spring](https://javatutorial.net/requestparam-annotation-in-spring)
......@@ -74,7 +74,7 @@ public class EmployeeController {
它之所以起作用,是因为“ id”与我们作为方法参数给出的名称相同,实际上是“ id”。 此外,我们无法对其他参数执行相同的操作,因为“名字”与“名字”不同。
#### @RequestParam 的必需元素
#### `@RequestParam`的必需元素
RequestParam 还支持“ required”元素,该元素几乎完成了所要表达的内容–它指定是否需要特定的参数。 对于我们的示例,我们可以说名字不是必需的。 默认情况下,requried 将设置为 true。
......@@ -98,7 +98,7 @@ public class EmployeeController {
现在,firstName 不是必需的参数,因此我们没有将其添加到模型/地图中。
#### @RequestParam 还具有“ defaultValue”元素
#### `@RequestParam`还具有`defaultValue`元素
如果我们需要在表单中填写一个值,但是我们并不真正在意那个值是什么,则可以将其设置为默认值,这样,如果用户没有填写它,它将只包含我们为它设置的任何内容。 请参阅以下代码片段作为参考:
......
# 春季拦截器
# Spring 拦截器
> 原文: [https://javatutorial.net/interceptors-in-spring](https://javatutorial.net/interceptors-in-spring)
......@@ -12,7 +12,7 @@
2. **postHandle()** –处理程序执行后调用。
3. **afterCompletion()** –在请求完成并生成视图之后调用。
### HandlerInterceptor 与 HandlerInterceptorAdapter
### `HandlerInterceptor`与`HandlerInterceptorAdapter`
首先,我说过我们需要实现 HandlerInterceptor 接口,但是我们也可以实现 HandlerInterceptorAdapter 。 它们之间有 1 个区别,就是 HandlerInterceptor 我们必须覆盖我上面提到的所有三种方法,而 HandlerInterceptorAdapter 允许我们仅覆盖所需的方法 方法。
......@@ -59,19 +59,19 @@ public class EmployeeInterceptor implements HandlerInterceptor {
首先我们创建我们的类并实现 HandlerInterceptor ,因为它会覆盖所有三个方法。 按照惯例,类名必须在初始名称之后具有 **拦截器** 。 然后,我们重写 **preHandle()**方法。 它包含 3 个参数-请求,响应和处理程序,并且不要忘记**引发异常。**
### preHandle()
### `preHandle()`
我的 preHandle()方法非常简单–它从请求中获取用户名和密码,然后检查它们是否为空以及是否为空,然后抛出异常,指出“空用户名或密码”。 如果它们不为空,则返回 true。 在正常环境中,您当然会做更多的验证,但是为了简单起见,我这样做了。
### postHandle()
### `postHandle()`
如果没有引发异常并记录请求,我的 postHandle()方法从返回 true 不会起到什么作用。 它包含 4 个参数-请求,响应,处理程序和 modelAndView。 它还**引发异常。** 通常,此方法用于修改 ModelAndView(通常通过添加其他属性)或简单地确定处理程序方法处理客户请求所花费的时间。
### afterCompletion()
### `afterCompletion()`
我的 afterCompletion()方法记录了请求和异常,但是在此之前,它通过说 **exc!= null** 来检查是否有异常,如果存在,那么我们说 **exc.printStackTrace ()**
### 组态
### 配置
我们的拦截器尚未添加到 Spring 配置中。 要添加它,我们必须实现一个自定义@Configuration 文件,该文件扩展了 WebMvcConfigurerAdapter ,该文件在 addInterceptors 方法内添加了拦截器。
......
# 春季国际奥委会
# Spring IOC
> 原文: [https://javatutorial.net/ioc-in-spring](https://javatutorial.net/ioc-in-spring)
......@@ -12,7 +12,7 @@
为什么这么重要? 好吧,这很重要,因为这些类可以仅专注于提供功能,而不是在正确的时间调用正确的依赖项。
## 国际奥委会到底是什么?
## IOC 到底是什么?
除了上面已经解释的内容外,还可以将控制反转(IOC)视为通常的总体工作流程的反转器,例如 高级对象处理依赖关系的方式。
......
......@@ -27,7 +27,7 @@ Spring IoC 容器的基础有两个软件包: **org.springframework.beans**
从上图可以看到,本质上发生的是配置元数据(对象的实例化,配置和组装),并且 JOVO 正在传递到 IOC 容器(很可能是 ApplicationContext 的实例)。
### 如何实例化 ApplicationContext
### 如何实例化`ApplicationContext`
```java
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
......
# Spring 中的 Dispatcher Servlet
# Spring 中的`DispatcherServlet`
> 原文: [https://javatutorial.net/dispatcher-servlet-in-spring](https://javatutorial.net/dispatcher-servlet-in-spring)
......@@ -10,7 +10,7 @@
![Dispatcher Servlet example](img/7278e3b6b6bc80336ad492e1b2587755.jpg)
### 分派器 Servlet 工作流程
### `DispatcherServlet`工作流程
以上介绍是顶级概述。 现在,让我们更具体地了解它在幕后的发生方式。
......
......@@ -18,7 +18,7 @@ Spring MVC 架构工作流程
4. 控制器处理请求并返回`ModelAndView`的实例
5. Dispatcher Servlet 进一步处理`ModelAndView`的实例,以将响应发送给客户端
## 在 Spring Boot 应用程序中启用 [JSP](https://javatutorial.net/java-jsp-example)
## 在 Spring Boot 应用程序中启用 JSP
如果要启用 JSP,则必须执行以下操作:
......@@ -45,7 +45,7 @@ spring.mvc.view.suffix=.jsp
创建文件夹`src/main/resources/META-INF/resources/WEB-INF/jsp/`并将 JSP 文件放入其中
## 实现 Spring Controller 返回 JSP 页面
## 实现 Spring 控制器返回 JSP 页面
以下示例演示如何在 Spring Controller 方法中返回 JSP 页面。 请注意`@Controller`注释和`@RequestMapping`注释的用法。 如果我们想返回一个 JSP 页面,我们将不使用`@ResponseBody`注释(如第二个示例所示)。
......@@ -149,7 +149,7 @@ public class RestControllerExample {
使用 Spring RestController 输出
## 在方法和类级别使用@RequestMapping 注释
## 在方法和类级别使用`@RequestMapping`注释
Spring 4.3 引入了诸如`@GetMapping``@PostMapping``@PutMapping`等注解,以指定常见 HTTP 方法类型(如 GET,POST 和 PUT)的映射。 这些注释增强了代码的可读性。
......
......@@ -89,7 +89,7 @@ public class ProductDaoImpl implements ProductDao {
如您所见,在 setSessionFactory()方法中,我们将 hibernateTemplate 设置为指定的 sessionFactory。
### 什么是 HibernateTemplate
### 什么是`HibernateTemplate`
HibernateTemplate 是一个类,可帮助简化数据访问代码。 此类将 HibernateExceptions 转换为 DataAccessExceptions,这是未经检查的异常。 HibernateTemplate 用于实现数据访问或业务逻辑服务。
......
......@@ -70,7 +70,7 @@ public string doSomething() throws Exception {
**@MockBean** 注释可帮助我们在控制器中模拟依赖项。
### EmployeeAccountControllerTest.java
### `EmployeeAccountControllerTest.java`
```java
@ExtendWith(SpringExtension.class)
......@@ -130,7 +130,7 @@ public class EmployeeAccountControllerTest {
在 Controller 测试示例中,我使用 **EmployeeService** 作为服务。 现在在本小节中,我们将看到该服务的**实现**
### EmployeeServiceImpl.java
### `EmployeeServiceImpl.java`
```java
@Service
......@@ -171,7 +171,7 @@ public class EmployeeServiceImpl implements EmployeeService {
现在,我们为实现创建测试类。
### EmployeeServiceTest.java
### `EmployeeServiceTest.java`
```java
@ExtendWith(SpringExtension.class)
......
......@@ -6,7 +6,7 @@
![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)
## Spring Security 简介
## Spring Security 简介
Spring Security 是一个可定制的身份验证框架。 在保护基于 Spring 的应用程序时,这是标准。 它提供身份验证和授权。 授权也称为“访问控制”。
......
......@@ -8,7 +8,7 @@
当我们在方法中使用@RequestMapping 时,我们可以添加一个名为产生的属性,该属性指定发送给用户的输出将为 JSON 格式。
### 例
###
**Employee.java**
......
# 春季 CSRF 保护
# Spring CSRF 保护
> 原文: [https://javatutorial.net/csrf-protection-in-spring](https://javatutorial.net/csrf-protection-in-spring)
......
# 什么是 Spring 中基于 OAuth2 的身份验证和授权
# Spring 中基于 OAuth2 的身份验证和授权
> 原文: [https://javatutorial.net/what-is-oauth2-based-authentication-and-authorization-in-spring](https://javatutorial.net/what-is-oauth2-based-authentication-and-authorization-in-spring)
......@@ -28,7 +28,7 @@ OAuth2 允许第三方应用程序代表资源所有者或通过允许第三方
4. 授权服务器
1. 在验证用户身份后发出访问令牌
## 不同的代币
## 不同的令牌
有两种类型的令牌:
......@@ -39,7 +39,7 @@ OAuth2 允许第三方应用程序代表资源所有者或通过允许第三方
1. 用于在原始令牌到期时获取新的访问令牌,因此名称
2. 但是由于安全原因,并非总是可能获得此令牌
## @ EnableOAuth2Sso
## `@EnableOAuth2Sso`
```java
@Configuration
......@@ -72,7 +72,7 @@ public class AppConfiguration extends WebSecurityConfigurerAdapter {
@Order 注解的工作是确保由我们的 WebSecurityConfigurerAdapter 创建的过滤器优先于由另一个 WebSecurityConfigurerAdapter 创建的过滤器。
## @EnableResourceServer
## `@EnableResourceServer`
现在,让我们设置资源服务器。
......
......@@ -30,7 +30,7 @@ Spring Boot 使创建独立的基于 Spring 的应用程序的过程变得非常
既然您知道 Spring Boot 是什么,并且已经熟悉了它的优势,那么让我向您展示如何立即开始使用它。
## 使用 [Maven](https://javatutorial.net/how-to-install-maven-on-windows-linux-and-mac) 构建
## 使用 Maven 构建
在您的项目目录中,创建一个子目录。
......@@ -114,7 +114,7 @@ public class DemoController {
现在是时候创建我们的 Application 类了。
## 让我们构建一个 DemoApplication
## 让我们构建一个`DemoApplication`
让我们创建我们的 DemoApplication 类。 应用程序类的路径为:
......
......@@ -8,7 +8,7 @@ MVC 代表 Model-View-Controller,Spring 支持它。 MVC 模式的优点在于
MVC 模式中的三个组件是 **Model,View,Controller** ,因此是首字母缩写。
## 角色
## 角色
#### 模型
......@@ -18,7 +18,7 @@ MVC 模式中的三个组件是 **Model,View,Controller** ,因此是首字
简而言之,可视化数据。
#### 控制
#### 控制
简而言之,控制器管理状态机的行为,也就是响应事件,命令执行和更新模型。 例如,当用户单击按钮时会发生什么。
......
# 春天的自动装配注释
# Spring 的`@Autowired`注解
> 原文: [https://javatutorial.net/autowired-annotation-in-spring](https://javatutorial.net/autowired-annotation-in-spring)
......@@ -6,13 +6,13 @@
![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)
## @Setter 方法上的自动标注
## setter 方法上的`@Autowired`
请注意,在 setter 方法上使用@Autowired 注解时,它会自动摆脱 XML 配置文件中的 &lt;属性&gt; 元素。 相反,当 Spring 发现使用@Autowired 注释的 setter 方法时,它将对该特定方法执行 **byType** “自动装配”。
让我们看看@Autowired 在实践中。 更具体地说,在设置方法上使用@Autowired。
### ExampleService.java
### `ExampleService.java`
```java
public class ExampleService {
......@@ -32,7 +32,7 @@ public class ExampleService {
感谢@Autowired 注解,在实例化 ExampleService 时,将 Employee 的实例作为该方法的参数注入。
## 构造函数上的@Autowired 注释
## 构造函数上的`@Autowired`注释
```java
public class ExampleService {
......@@ -53,7 +53,7 @@ public class ExampleService {
再次感谢@Autowired 注释,当实例化 ExampleService 时,将 Employee 的实例作为构造函数的参数注入。
## 属性上的@Autowired 注释
## 属性上的`@Autowired`注释
自动装配属性节省了我们的时间和代码行。 怎么样? 好吧,当我们在属性上使用该注解时,这些属性不再需要 getter 和 setter。 酷吧?
......@@ -103,6 +103,6 @@ public class ExampleService {
我们需要可选依赖项的原因是因为 Spring 希望在构造依赖项 bean 时@Autowired 的依赖项可用。 否则,将引发错误。 由于 **required = false** ,我们可以解决此问题。
## 摘要
## 总结
通过使用@Autowired 注解,我们节省了几行代码,还节省了一些时间,因为我们不需要指定属性和构造函数参数。
\ No newline at end of file
......@@ -17,7 +17,7 @@ AOP 中有 7 个核心概念。
1. 业务对象:正常的业务逻辑。
2. 方面:实现跨多个类的企业应用程序关注点。
3. 连接点:应用程序中的特定点,例如变量值,异常处理,方法执行等。
4. 忠告:针对特定连接点采取的操作。
4. 建议:针对特定连接点采取的操作。
5. 切入点:与连接点匹配的表达式,其目的是确定是否需要执行建议。
6. 目标对象:建议适用于此。
7. AOP 代理:使用 [JDK](https://javatutorial.net/install-java-8-jdk-on-ubuntu) 动态代理创建的 AOP 实现类,以使用目标类和建议调用/调用创建代理类。
......@@ -43,17 +43,17 @@ public class Example {
这是完全普通的类,没有任何与 Spring 相关的注释。
### AOP 咨询类型
### AOP 建议类型
1. 在建议之前:这些建议在执行连接点方法之前运行。 要将建议类型标记为之前,我们可以使用@Before 注释。
2. 忠告之后:这些忠告在执行连接点方法之后运行。 要将建议类型标记为 After,可以使用@After 注解。
2. 建议之后:这些建议在执行连接点方法之后运行。 要将建议类型标记为 After,可以使用@After 注解。
3. 返回建议之后:仅在连接点方法正常执行(不表示异常)时运行这些建议。 要将建议类型标记为“返回后”,我们可以使用@AfterReturning 注解。
4. 抛出建议后:仅在连接点方法抛出异常时才运行这些建议(与“返回建议之后”相反)。 要将建议类型标记为“抛后”,我们可以使用@AfterThrowing 注解。
5. 围绕建议:这些建议为我们提供了灵活性,因为借助它们的使用,我们可以选择是否执行连接点方法。
让我们看看如何实现这些不同的建议类型。
**咨询之前**
**建议之前**
```java
import org.aspectj.lang.annotation.Aspect;
......@@ -70,7 +70,7 @@ public class BeforeAdviceDemo {
通过使用@Before 注解,我们指定这是一个 **BeforeAdvice。**
**咨询后**
**建议后**
```java
import org.aspectj.lang.annotation.Aspect;
......@@ -119,7 +119,7 @@ public class AfterThrowingAdviceDemo {
}
```
**忠告**
**建议**
Around 类型的实现有些棘手。 由于这种类型的建议可以在方法执行之前和之后执行工作,因此它需要以线程安全的方式共享该方法执行之前和之后的状态。
......
# 春豆简介
# Sping Bean 简介
> 原文: [https://javatutorial.net/introduction-to-spring-bean](https://javatutorial.net/introduction-to-spring-bean)
......@@ -6,7 +6,7 @@
![spring-featured-image](img/d2f73752d8ae931b119dec1eac866973.jpg)
## 什么是春豆
## 什么是 Sping Bean
Bean 是构成应用程序的对象,并由 Spring IoC 容器管理。 [Spring Framework 文档](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-introduction)的正式定义是:
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。 Bean 是由 Spring IoC 容器实例化,组装和以其他方式管理的对象。
......
# 安卓系统
\ No newline at end of file
# 安卓
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册