淮北住房和城乡建设局门户网站,十大网络舆情案例,如何做网站预览,网站怎么做成app文章目录01. Spring 配置方式有几种#xff1f;02. Spring 如何实现基于xml的配置方式#xff1f;03. Spring 如何实现基于注解的配置#xff1f;04. Spring 如何基于注解配置bean的作用范围#xff1f;05. Spring Component, Controller, Repository, Service 注解有何区别…
文章目录01. Spring 配置方式有几种02. Spring 如何实现基于xml的配置方式03. Spring 如何实现基于注解的配置04. Spring 如何基于注解配置bean的作用范围05. Spring Component, Controller, Repository, Service 注解有何区别?06. Spring 如何实现bean依赖注入注解开发?07. Spring Value注解注入基本类型数据08. Spring Autowired注解注入引用类型数据09. Spring Autowired注解自动装配的过程是怎样的10. Spring Autowired注解注入多个匹配类型的Bean11. Spring Qualifier 注解的作用12. Java Resource 注解的作用13. Spring Autowired注解的使用方式有哪些14. Spring Autowired和 Java Resource之间的区别15. Spring Bean注解实现非自定义bean的注入16. Spring 基于配置类的注解开发17. Spring 如何开启基于注解的自动写入18. Spring 基于Java的注解配置是什么?19. Spring Primary注解的作用20. 一个类不加任何注解和配置会被Spring容器注册吗21. 一个类不加任何注解和配置会依赖注入吗01. Spring 配置方式有几种
Spring除了xml配置文件进行配置之外还可以使用注解方式进行配置注解方式慢慢成为xml配置的替代方案。
(1) 基于XML的配置方式Spring的诞生 (2) 基于注解的配置方式2.5时代Spring的Bean配置可以使用注解完成 (3) 基于Java的配置方式3.0时代Spring其他配置也可以使用注解完成我们进入全注解时代
02. Spring 如何实现基于xml的配置方式
使用XML文件来配置Spring应用程序包括Bean的定义、依赖关系、AOP等。这是Spring最早的配置方式也是最常用的一种方式。
public class UserDaoImpl implements UserDao{Overridepublic void show(){System.out.println(执行show....);}
}public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao){this.userDao userDao;}
}bean iduserService classcom.service.impl.UserServiceImplproperty nameuserDao refuserDao/
/bean
bean iduserDao classcom.dao.impl.UserDaoImpl/03. Spring 如何实现基于注解的配置
第一步使用Component注解将其标记在一个类上表示该类是一个Spring容器中的Bean。可以使用value属性指定Bean的名称如果没有指定名称则默认使用类名的首字母小写作为Bean的名称。
Component
public class UserDaoImpl implements UserDao{Overridepublic void show(){System.out.println(执行show....);}
}Component
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao){this.userDao userDao;}
}第二步使用context:component-scan 标签用于指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
!--注解组件扫描--
context:component-scan base-packagecom.hh/使用context:component-scan指定了要扫描的包路径为com.hh这样就可以自动扫描该包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
第三步测试
public class ApplicationContextTest {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);UserDao userDao applicationContext.getBean(UserDao.class);userDao.show();System.out.println(userDao);}
}04. Spring 如何基于注解配置bean的作用范围 Scope(value singleton)
Lazy(value false)
Component
public class UserDaoImpl implements UserDao{Overridepublic void show(){System.out.println(执行show....);}
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/05. Spring Component, Controller, Repository, Service 注解有何区别? Component、Controller、Repository和Service都是Spring框架中的注解用于标记一个类为Spring容器中的Bean用于替代bean标签。它们的区别在于使用场景和语义上的差异。 Component注解用于标记一个类为Spring容器中的Bean通常用于标记中立的组件没有明确的角色。 Controller注解用于标记一个类为Spring MVC中的Controller通常用于处理HTTP请求和响应。 Repository注解用于标记一个类为数据访问层DAO中的组件通常用于访问数据库或其他持久化存储。 Service注解用于标记一个类为业务逻辑层Service中的组件通常用于封装业务逻辑和调用DAO层的方法。 这些注解的作用是相似的都是用于标记一个类为Spring容器中的Bean并且可以使用Autowired注解进行自动装配。但是它们的语义和使用场景是不同的使用不同的注解可以更加清晰地表达代码的意图也有助于代码的维护和扩展。
需要注意的是Controller、Repository和Service注解都是Component注解的派生注解它们都可以被视为Component注解的特殊情况。因此如果一个类没有明确的角色可以使用Component注解来标记。
06. Spring 如何实现bean依赖注入注解开发? 07. Spring Value注解注入基本类型数据
Spring中的Value注解用于将属性值注入到Spring管理的Bean中。它可以用于注入简单的值如字符串、数字和布尔值也可以用于注入复杂的对象如数组、集合和自定义对象。
Value注解可以用在字段、方法和构造函数上。它支持SpEL表达式可以从配置文件、环境变量、系统属性等多种来源获取属性值。
Component
public class UserDaoImpl implements UserDao{public UserDaoImpl(){}// 用于字段上Value(zhangsan)private String username;// 从配置文件中取值Value(${jdbc.driver})private String driver;private String password;private int age;// 用于方法上Value(lisi)public void setPassword(String password){this.password password;}// 用于构造方法上public UserDaoImpl(Value(18) int age){this.age age;}Overridepublic void show(){System.out.println(username);System.out.println(password);System.out.println(age);System.out.println(driver);}
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/
context:property-placeholder locationjdbc.properties/在上面的示例中Value注解用于将username的属性值注入到username字段中将配置文件中的jdbc.driver属性值注入到driver字段中。
08. Spring Autowired注解注入引用类型数据
Autowired注解是Spring框架中的一个注解用于自动装配Bean。它可以自动在Spring容器中查找匹配类型的Bean并将其注入到目标对象中。Autowired注解也可以用于构造函数、Setter方法和字段上用于不同的自动装配方式。
下面是一个使用Autowired注解的示例
Component
public class MyController {Autowiredprivate MyService myService;// ...
}在上面的示例中我们使用Autowired注解自动装配了MyService对象并将其注入到MyController中。这样我们就可以在MyController中使用MyService对象了。
09. Spring Autowired注解自动装配的过程是怎样的
Spring的Autowired注解是一种自动装配的方式它可以自动将一个Bean的依赖项注入到另一个Bean中。Autowired注解的自动装配过程如下
① Spring容器在初始化Bean时会扫描所有的Bean查找与依赖项类型相同的Bean。
② 如果找到了与依赖项类型相同的Bean则将其注入到目标Bean中。如果找到了多个与依赖项类型相同的Bean则会寻找与依赖项名称相同的Bean。
③ 如果找到了与依赖项名称相同的Bean则将其注入到目标Bean中。如果找到了多个与依赖项名称相同的Bean则会抛出异常。
④ 如果没有找到与依赖项名称相同的Bean则会抛出异常。
需要注意的是Autowired注解默认使用byType自动装配模式如果需要使用byName自动装配模式可以结合Qualifier注解来使用。Qualifier注解可以指定要注入的Bean的名称以解决byName自动装配模式下的歧义性问题。
另外Autowired注解还可以用于构造函数、Setter方法和字段上以实现不同的自动装配方式。在构造函数和Setter方法上使用Autowired注解可以实现构造函数和Setter方法的自动装配在字段上使用Autowired注解可以实现字段的自动装配。
10. Spring Autowired注解注入多个匹配类型的Bean
容器中存在3个UserDao类型的bean
Repository
public class UserDaoImpl implements UserDao{
}Repository
public class UserDaoImpl1 implements UserDao{
}Repository
public class UserDaoImpl2 implements UserDao{
}Component
public class UserServiceImpl implements UserService {Autowiredprivate UserDao userDao;
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/因为容器中存在多个与依赖项类型相同依赖项名称相同的bean因此抛出异常 此时如果想要成功注入可以指定容器中依赖项bean的名称
Repository(userDao)
public class UserDaoImpl implements UserDao{
}Repository(userDao1)
public class UserDaoImpl1 implements UserDao{
}Repository(userDao2)
public class UserDaoImpl2 implements UserDao{
}Component
public class UserServiceImpl implements UserService {// 存在多个类型相同的bean时根据名称注入属性名称和bean的名称相同即可Autowiredprivate UserDao userDao;
}Component
public class UserServiceImpl implements UserService {// 存在多个类型相同的bean时根据名称注入属性名称和bean的名称相同即可Autowiredprivate UserDao userDao1;
}11. Spring Qualifier 注解的作用
Qualifier注解是Spring框架中的一个注解用于指定要注入的Bean的名称。它通常与Autowired注解一起使用用于解决自动装配时存在多个匹配类型的Bean的问题。
容器中存在3个类型相同的bean名称分别为userDao、userDao1、userDao2
Repository(userDao)
public class UserDaoImpl implements UserDao{
}Repository(userDao1)
public class UserDaoImpl1 implements UserDao{
}Repository(userDao2)
public class UserDaoImpl2 implements UserDao{
}Component
public class UserServiceImpl implements UserService {// 存在多个类型相同的bean时根据名称注入属性名称和bean的名称可以不同// 使用Qualifier指定注入bean的名称AutowiredQualifier(userDao1)private UserDao userDao;
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/Qualifier注解也可以用于构造函数、Setter方法和字段上用于不同的自动装配方式。
12. Java Resource 注解的作用
Resource注解是Java EE中的一个注解用于自动装配Bean。它可以自动在Java EE容器中查找匹配名称或类型的Bean并将其注入到目标对象中。
使用Resource注解时可以指定要注入的Bean的名称或类型。如果指定了名称则容器会查找名称匹配的Bean进行注入如果没有指定名称则容器会查找类型匹配的Bean进行注入。如果容器中存在多个匹配的Bean则会抛出异常。
下面是一个使用Resource注解的示例
Repository(userDao)
public class UserDaoImpl implements UserDao{
}Repository(userDao1)
public class UserDaoImpl1 implements UserDao{
}Repository(userDao2)
public class UserDaoImpl2 implements UserDao{
}Component
public class UserServiceImpl implements UserService {Resource(nameuserDao1)private UserDao userDao;
}context:component-scan base-packagecom.hh/需要注意的是Resource注解只能用于字段和Setter方法上不能用于构造函数上。
13. Spring Autowired注解的使用方式有哪些
Autowired注解可以用于构造函数、Setter方法和字段上用于不同的自动装配方式。通常情况下我们会在字段上使用Autowired注解进行自动装配。
Repository(userDao)
public class UserDaoImpl implements UserDao{
}Repository(userDao1)
public class UserDaoImpl1 implements UserDao{
}Repository(userDao2)
public class UserDaoImpl2 implements UserDao{
}Component
public class UserServiceImpl implements UserService {private UserDao userDao;// 根据参数的类型进行匹配,如果类型相同则再根据参数的名称注入Autowiredpublic void setUserDao(UserDao userDao2){System.out.println(userDao2);}// 根据参数的类型进行匹配,将容器中UserDao类型的bean注入到集合userDaoList中Autowiredpublic void setXXX(ListUserDao userDaoList){System.out.println(userDaoList);}
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/com.dao.impl.UserDaoImpl262bd765 [com.dao.impl.UserDaoImpl44a664f2, com.dao.impl.UserDaoImpl17f9fcf7f, com.dao.impl.UserDaoImpl262bd765] 14. Spring Autowired和 Java Resource之间的区别
Spring框架中的Autowired注解和Java EE中的Resource注解都是用于自动装配Bean的注解它们的作用类似但是在使用方式和功能上有一些区别。
(1) 使用方式Autowired注解可以用于构造函数、Setter方法和字段上而Resource注解只能用于字段和Setter方法上。
(2) 自动装配方式Autowired注解默认是按照类型进行自动装配的如果容器中存在多个匹配类型的Bean可以使用Qualifier注解指定Bean的名称。而Resource注解默认是按照名称进行自动装配的如果指定了名称则容器会查找名称匹配的Bean进行注入如果没有指定名称则容器会查找类型匹配的Bean进行注入。
(3) 作用范围Autowired注解是Spring框架中的注解只能用于Spring应用程序中而Resource注解是Java EE中的注解可以用于Java EE应用程序中。
(4) 兼容性Autowired注解是Spring框架中的注解不兼容Java EE应用程序而Resource注解是Java EE中的注解可以与Spring框架进行集成。
需要注意的是Autowired注解和Resource注解都可以用于自动装配Bean但是在使用时需要根据具体的场景进行选择。如果是在Spring应用程序中使用建议使用Autowired注解如果是在Java EE应用程序中使用建议使用Resource注解。
15. Spring Bean注解实现非自定义bean的注入
Component
public class OtherBean {Bean(dataSource)public DataSource dataSource(){DruidDataSource dataSource new DruidDataSource();return dataSource;}
}用指定Spring容器扫描的包路径。它可以自动扫描指定包及其子包下的所有类并将标记为Component、Controller、Service、Repository等注解的类注册为Spring容器中的Bean。
context:component-scan base-packagecom.hh/
context:property-placeholder locationjdbc.properties/如果不加Component注解那么OtherBean就不会被Spring容器扫描注册dataSource也不会注册为Spring容器的bean了。
如果Bean工厂方法需要参数的话则有如下几种注入方式 1、使用Autowired 根据类型自动进行Bean的匹配Autowired可以省略 2、使用Qualifier 根据名称进行Bean的匹配 3、使用Value 根据名称进行普通数据类型匹配。
Component
public class OtherBean {Bean(dataSource)public DataSource dataSource(Value(${jdbc.username}) String username,Qualifier(userDao2) UserDao userDao,UserService userService){System.out.println(username);System.out.println(userDao);return new DruidDataSource();}
}jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/mybatis
jdbc.usernameroot
jdbc.passwordroot16. Spring 基于配置类的注解开发
context:property-placeholder locationclasspath:jdbc.properties/
context:component-scan base-packagecom.itheima/
import resourceclasspath:beans.xml/Component等注解替代了bean标签但是像import、context:componentScan 等非bean 标签怎 样去使用注解替代呢
ComponentScan(basePackages com.hh)
PropertySource(classpath:jdbc.properties)
Configuration
public class AppConfig {}bean标签以外的标签一般都是在配置类上使用注解完成的
① Configuration 注解来标记一个类为配置类替代原有xml配置文件该注解第一个作用是标识该类是一个配置类第二个作用是具备Component作用
② ComponentScan 组件扫描配置
指定一个或多个包名扫描指定包及其子包下使用注解的类不配置包名扫描当前componentScan注解配置类所在包及其子包下的类
③ PropertySource 注解用于加载外部properties资源配置
④ Import 用于加载其他配置类
17. Spring 如何开启基于注解的自动写入
在Spring中可以通过在配置类上添加ComponentScan注解来开启基于注解的自动装配。ComponentScan注解会扫描指定的包及其子包中的所有类将其中被Component、Service、Repository、Controller等注解标记的类自动注册为Bean。
以下是一个示例
Configuration
ComponentScan(basePackages com.example)
public class AppConfig {// 配置其他Bean
}在上面的示例中ComponentScan注解指定了要扫描的包为com.exampleSpring容器会自动扫描该包及其子包中的所有类并将其中被Component、Service、Repository、Controller等注解标记的类自动注册为Bean。
需要注意的是开启基于注解的自动装配时需要确保被注解标记的类已经被正确地扫描到并且注解的作用范围和生命周期符合预期。如果出现了无法自动装配的情况可以通过调整ComponentScan注解的参数或添加其他注解来解决问题。
18. Spring 基于Java的注解配置是什么?
基于Java的Spring注解配置是一种使用Java代码来配置Spring应用程序的方式它使用注解来代替传统的XML配置文件。通过使用注解我们可以更加简洁和直观地配置Spring应用程序同时也可以减少配置文件的数量和复杂度。
在基于Java的Spring注解配置中我们可以使用一些特定的注解来配置Spring应用程序例如 Configuration用于标记配置类相当于传统的XML配置文件。 Bean用于标记方法表示该方法返回的对象将被注册为Spring容器中的一个Bean。 ComponentScan用于自动扫描指定包下的所有组件并将其注册为Spring容器中的Bean。 Autowired用于自动装配Bean可以在需要使用Bean的地方直接使用该注解进行注入。 下面是一个简单的基于Java的Spring注解配置的示例
Configuration
ComponentScan(basePackages com.example)
public class AppConfig {Beanpublic MyService myService() {return new MyServiceImpl();}Beanpublic MyController myController() {return new MyControllerImpl(myService());}
}在上面的示例中我们使用Configuration注解标记了一个配置类并使用ComponentScan注解自动扫描了com.example包下的所有组件。同时我们还使用Bean注解标记了两个方法分别返回MyService和MyController对象并将其注册为Spring容器中的Bean。最后我们在MyController的构造函数中使用Autowired注解自动装配了MyService对象。
19. Spring Primary注解的作用
在 Spring 中当存在多个相同类型的 Bean 时如果没有指定优先级或者限定符Spring 将无法确定应该使用哪个 Bean。这时可以使用 Primary 注解来指定一个 Bean 为首选 Bean当存在多个相同类型的 Bean 时Spring 将优先选择被 Primary 注解标记的 Bean。
public interface UserDao {void show();
}Repository
public class UserDaoImpl implements UserDao{Overridepublic void show() {System.out.println(UserDaoImpl....);}
}Repository
Primary
public class UserDaoImpl2 implements UserDao {Overridepublic void show() {System.out.println(UserDaoImpl2....);}
}Service
public class UserServiceImpl {Autowiredprivate UserDao userDao;public UserServiceImpl(UserDao userDao){this.userDao userDao;}public void test(){userDao.show();}
}在上面的示例中UserDaoImpl2 类被标记为 Primary表示它是首选的 Bean。当我们在其他组件中注入 UserDao 类型的 Bean 时Spring 将优先选择 UserDaoImpl2 类型的 Bean
ComponentScan(basePackages com.hh)
Configuration
public class AppConfig {}public class ApplicationContextTest {public static void main(String[] args) throws Exception {AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(AppConfig.class);UserServiceImpl userService (UserServiceImpl)applicationContext.getBean(userServiceImpl);userService.test();}
}UserDaoImpl2… AnnotationConfigApplicationContext 是 Spring 框架中的一个应用上下文ApplicationContext实现它可以通过 Java 配置类来加载 Spring 应用程序上下文。
在使用 AnnotationConfigApplicationContext 时我们可以通过传入一个或多个 Java 配置类的 Class 对象来加载 Spring 应用程序上下文。这些配置类中可以包含 Configuration、ComponentScan、Import 等注解用于配置 Spring 应用程序上下文中的 Bean。
20. 一个类不加任何注解和配置会被Spring容器注册吗
如果一个类没有任何注解和配置它不会被Spring容器自动注册。Spring容器只会自动扫描带有特定注解的类例如Component、Service、Controller、Repository等。如果一个类没有这些注解也没有在配置文件中进行手动配置那么它就不会被Spring容器注册。
21. 一个类不加任何注解和配置会依赖注入吗
如果一个类没有任何注解和配置它不会被Spring容器自动注册也就不会进行依赖注入。依赖注入是通过Spring容器来实现的只有被Spring容器管理的Bean才能进行依赖注入。如果一个类没有被Spring容器管理那么它就无法进行依赖注入。因此如果想要进行依赖注入必须要将类注册到Spring容器中可以通过在类上添加Component、Service、Controller、Repository等注解来实现。
public class I18nUtils {private static MessageSource messageSource;Autowiredpublic void setMessageSource(MessageSource messageSource) {I18nUtils.messageSource messageSource;}public static String i18n(String code, Object... args) {return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());}
}I18nUtils类没有加注解bean的注解也就不会被Spring容器注册因此messageSource即使使用了Autowired注解也不会被注入Autowired注解只有在Spring Bean内才会生效。