Spring基础知识

Spring Framework是一个开源的Java框架,它被广泛应用于企业级应用程序开发。Spring通过提供多种功能来弥补Java EE的不足,同时具有轻量级、灵活性、易用性等特点。本文将介绍Spring框架的基础概念、核心功能以及常用模块。

一、IOC和DI

Spring框架是一个轻量级的应用程序开发框架,它提供了很多功能,其中最重要的是IOC(控制反转)和DI(依赖注入)。这两个概念是Spring框架实现解耦的基础,让应用程序开发更加灵活。

1. IOC

1.1 概念

IOC的全称是Inversion of Control,也叫控制反转,是Spring框架的核心思想之一。简单来说,它是一种设计模式,将对象的创建和组装过程交给容器来实现,从而减少类之间的依赖关系,降低了系统的耦合性。

1.2 实现

IOC的实现方式是将对象的创建交给Spring容器,而容器在启动时会读取配置文件或注解,将对象创建出来并管理它们的生命周期。这样,我们在应用程序中就不需要直接new对象了,而是通过容器来获取需要的对象。

1.3 示例

下面我们通过一个简单的例子来说明IOC的具体实现。

首先,我们定义一个UserService接口,如下:

public interface UserService {
    void sayHello();
}

然后,实现这个接口的两个类,如下:

@Component
public class UserServiceImpl implements UserService {
    @Override
    public void sayHello() {
        System.out.println("Hello World!");
    }
}

@Component
public class UserServiceImpl2 implements UserService {
   @Override
   public void sayHello() {
       System.out.println("Hello Spring!");
   }
}

然后在Spring的配置文件中声明这些类:

<bean id="userService1" class="com.example.UserServiceImp1"/>
<bean id="userService2" class="com.example.UserServiceImp2"/>

这样,在应用程序中就可以通过容器获取UserService对象:

public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = context.getBean("userService1", UserService.class);
        userService.sayHello();
    }
}

执行结果为:Hello World!

2. DI

2.1 概念

DI的全称是Dependency Injection,也叫依赖注入。它是IOC的具体实现,即容器通过反射机制将依赖的对象注入到目标对象中,从而解决类之间的依赖关系。

2.2 实现

DI的实现方式有三种常见方式:构造方法注入、setter方法注入和接口注入。

构造方法注入:在类中定义构造方法,容器会读取参数类型并自动注入依赖对象。

@Component
public class UserController {
   private UserService userService;
   public UserController(UserService userService) {
       this.userService = userService;
  }
}

setter方法注入:通过定义setter方法来注入依赖对象。

@Component
public class UserController {
   private UserService userService;
   public void setUserService(UserService userService) {
       this.userService = userService;
  }
}

接口注入:实现接口注入注入依赖对象。

public interface UserDAO {
   void save(User user);
}

@Component
public class UserDAOImpl implements UserDAO {
   public void save(User user) {
      //save user to database
   }
}

@Component
public class UserServiceImpl implements UserService {
   private UserDAO userDAO;
   public UserServiceImpl(UserDAO userDAO) {
      this.userDAO = userDAO;
   }
}
2.3 示例

我们以setter方法注入为例,继续扩展上一个例子,定义一个UserController类,注入UserService对象。

@Component
public class UserController {
    private UserService userService;
  
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
  
    public void displayHello() {
        userService.sayHello();
    }
}

然后在Spring配置文件中声明这些类:

<bean id="userService" class="com.example.UserServiceImpl"/>
<bean id="userController" class="com.example.UserController">
   <property name="userService" ref="userService"/>
</bean>

这样,我们可以在应用程序中直接调用UserController的displayHello方法:

public class MyApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController userController = context.getBean("userController", UserController.class);
        userController.displayHello();
    }
}

执行结果为:Hello World!

IOC和DI是Spring框架的核心,它们是实现解耦的关键。通过IOC和DI,使得应用程序之间的依赖关系变得松散,提高了程序的可重用性、灵活性,同时也方便了程序的测试和维护。

二、Spring中的Bean管理和AOP

Spring框架是一个功能强大的Java应用程序开发框架,其中的Bean管理和AOP是其核心组件。

1. Bean管理

1.1 Bean是什么?

在Spring中,Bean是Spring容器中的组件,是由Spring容器创建、组装和管理的对象实例。Bean可以是任何普通的Java类,可以通过配置文件或注解的方式进行定义。

1.2 Bean的声明周期

在Spring中,Bean的声明周期包括创建、初始化和销毁三个阶段。在创建阶段,Spring容器根据配置文件或注解创建并实例化Bean。在初始化阶段,Spring容器对Bean进行初始化设置,可以通过回调方法或注解实现。在销毁阶段,Spring容器会销毁不再使用的Bean,释放资源。

1.3 Bean的创建和获取

创建Bean的方式有多种,常见的方式有配置文件方式和注解方式。配置文件方式通过XML文件或Java Config文件来定义Bean的配置信息。注解方式使用Spring提供的注解(如@Component、@Service等)来标识一个类为Bean。

获取Bean的方式也有多种,最常见的是通过ApplicationContext容器来获取。可以通过Bean的名称或类型来获取Bean的实例。

1.4 依赖注入

依赖注入是实现IOC的重要手段之一。通过依赖注入,Bean可以将它所依赖的其他Bean的实例注入到自己的成员变量或方法参数中。

依赖注入可以通过构造函数注入、Setter方法注入和字段注入等方式实现。

2. AOP(面向切面编程)

2.1 AOP是什么?

AOP是一种编程范式,它提供了一种将横切关注点(如日志、事务管理等)从业务逻辑中分离的方式。通过AOP,可以将这些横切关注点抽象成切面(Aspect),并将其应用到Bean的方法上。

2.2 切面(Aspect)

切面是AOP的核心概念,它由切点(Pointcut)和通知(Advice)组成。切点定义了在哪些方法上应用切面,通知定义了在切点的前、后或异常抛出时,需要执行的代码逻辑。

2.3 AOP的实现方式

在Spring中,AOP通过动态代理实现。Spring提供了两种动态代理方式:基于JDK的动态代理和基于CGLIB的动态代理。

JDK动态代理要求目标对象实现接口,并通过接口的方式生成动态代理类。CGLIB动态代理不要求目标对象实现接口,通过直接生成目标对象的子类来实现动态代理。

2.4 实现AOP的方式

在Spring中,实现AOP有两种方式:XML配置方式和注解方式。

XML配置方式通过配置文件来定义切面和切点,并将其应用到Bean的方法上。注解方式使用Spring提供的注解(如@Aspect、@Pointcut、@Before等)来标识切面、切点和通知。

示例代码:
下面通过一个示例代码来说明Spring中的Bean管理和AOP的用法:

public interface UserService {
    void addUser(String name);
}

@Component
public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("Adding user: " + name);
    }
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.UserService.addUser(..))")
    public void beforeAdvice() {
        System.out.println("Before adding user");
    }
}

@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy
public class AppConfig {
}

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    UserService userService = context.getBean(UserService.class);
    userService.addUser("Alice");
}

在上述示例中,通过@Component注解将UserServiceImpl类定义为一个Bean。通过@Aspect和@Before注解将LoggingAspect类定义为一个切面,并将其应用到UserService接口的addUser方法上。通过@Configuration和@EnableAspectJAutoProxy注解来启用AOP功能。

运行上述代码,将会输出以下结果:

Before adding user
Adding user: Alice

Bean管理通过IOC容器管理Bean的创建和获取,依赖注入实现了Bean之间的解耦。AOP通过动态代理实现,提供了一种将横切关注点从业务逻辑中分离的方式。通过XML配置方式或注解方式,我们可以方便地实现AOP功能。深入理解Spring中的Bean管理和AOP,对于开发高效、可维护的企业级应用程序非常重要。

三、Spring的配置方式

Spring框架提供了多种配置方式,包括XML配置、注解配置和Java配置,您可以选择最适合您的应用程序的配置方式。下面分别介绍这些配置方式:

1. XML配置

XML配置是最常见的Spring配置方式。通过使用XML文件定义Bean和它们之间的依赖关系,可以轻松地实现IOC和DI。

示例代码如下:

<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDao"/>

2. 注解配置

注解配置是通过在类和方法上使用注解来实现Bean的配置和依赖注入的方式。相对于XML配置更为简洁和方便。

示例代码如下:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
}

@Repository
public class UserDao {
}

在上面的示例中,@Service和@Repository注解分别用于配置UserService和UserDao Bean,并通过@Autowired注解实现依赖注入。

3. Java配置

Java配置是通过使用Java代码来配置Bean和依赖关系的方式。Java配置往往比XML配置更加简洁和易于维护。

示例代码如下:

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService(userDao());
    }

    @Bean
    public UserDao userDao() {
        return new UserDao();
    }
}

在上面的示例中,使用@Configuration注解声明该类为Java配置类,通过使用@Bean注解来定义Bean对象,最后使用@Autowired注解来实现依赖注入。

四、Spring的常用模块

Spring框架提供了许多功能模块,包括Spring MVC、Spring Data、Spring Security等。Spring MVC用于Web应用开发,简化了HTTP请求和响应的处理;Spring Data用于数据访问,简化了与数据库的交互;Spring Security用于安全管理,提供了全面的安全解决方案.下面介绍这几个常用的模块:

1. Spring MVC

1.1 Spring MVC是什么?

Spring MVC是Spring框架的Web应用程序开发模块,它提供了一种基于MVC(Model-View-Controller)的架构模式来构建Web应用。通过Spring MVC,开发人员可以更方便地处理HTTP请求和响应,实现页面跳转、数据验证和错误处理等功能。

1.2 Spring MVC的核心组件

在Spring MVC中,请求被DispatcherServlet处理,并被映射到特定的处理程序(控制器)上,从而实现对请求的处理和响应的生成。

核心组件包括控制器(Controller)、模型(Model)和视图(View)。控制器负责处理客户端的请求,模型负责封装数据,视图负责展示页面。

1.3 Spring MVC的配置

配置可以通过XML文件或Java Config类来实现。配置包括定义控制器、视图解析器、拦截器、数据绑定等。

以下是一个简单的示例代码,演示了如何使用Spring MVC创建一个简单的控制器和视图:

@Controller
public class HelloWorldController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "hello";
    }
}

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    // 配置视图解析器
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

2. Spring Data

2.1 Spring Data是什么?

Spring Data是Spring框架的数据访问模块,它为我们简化了与数据库的交互,并提供了一致的API来操作不同类型的数据存储系统。Spring Data支持关系型数据库、文档数据库、列式数据库等。

2.2 Spring Data的特点

Spring Data的特点包括:简化数据访问、提供通用的查询方式、自动生成DAO层代码、支持事务管理等。

2.3 Spring Data的使用

Spring Data的使用需要定义实体类、仓库接口和查询方法。通过仓库接口和方法的命名规则,Spring Data会自动实现基本的数据操作。

以下是一个简单的示例代码,演示了如何使用Spring Data操作数据库:

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    // 省略getter和setter
}

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

@Configuration
@EnableJpaRepositories(basePackages = "com.example")
public class AppConfig {
    // 配置数据源和JPA实体管理器等
}

3. Spring Security

3.1 Spring Security是什么?

Spring Security是Spring框架的安全管理模块,它为我们提供了一套全面的安全解决方案,包括身份认证、授权和攻击防护等功能。通过Spring Security,我们可以轻松地实现用户认证、角色权限管理和防护措施等。

3.2 Spring Security的核心概念

核心概念包括用户(User)、权限(Authority)、角色(Role)和访问控制(Access Control)。用户表示系统中的用户,权限表示用户能够执行的操作,角色表示一组权限的集合,访问控制定义了哪些用户可以访问哪些资源。

3.3 Spring Security的使用

Spring Security的使用需要配置安全策略、用户存储和访问控制等。可以通过XML文件或Java Config类来进行配置。

以下是一个简单的示例代码,演示了如何使用Spring Security进行用户认证和角色权限管理:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .and()
                .formLogin()
                .and()
                .logout();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("{noop}admin").roles("ADMIN")
                .and()
                .withUser("user").password("{noop}user").roles("USER");
    }
}

本文主要是进行了基础内容的介绍,后续会逐步进行更加详细的介绍。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值