• IOC操作Bean管理(基于注解方式)


    什么是注解?

    (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
    (2)使用注解,注解可以作用在类上面,方法上面,属性上面
    (3)使用注解的目的:简化xml配置,把配置用更简洁,更优雅的方式实现

    Spring针对Bean管理中创建对象提供注解

    (1)@Component:用它可以创建对象


    (2)@Service:一般用在业务逻辑层,service层上


    (3)@Controller:外部层上


    (4)@Repository:一般用在Dao层

    上面4个注解,它们的功能是一样的,都可以用来创建Bean对象。只是一般习惯每个注解用在不同层中,让开发人员更加清晰当前组件所扮演的角色

    基于直接方式实现对象创建

    第一步:引入依赖 spring-aop-5.2.6RELEASE.jar这个jar包
    我这里就直接用maven已经直接引入依赖

    第二步:开启组件扫描
    (1)如果扫描多个包,多个包使用逗号隔开
    (2)扫描包的上层目录

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:context="http://www.springframework.org/schema/context"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    5. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    6. <context:component-scan base-package="com.godairo.spring5">context:component-scan>
    7. beans>

    这里component英文单词是组件的意思,scan扫描的意思

    base-package就是你要在写的包开启组件扫描

    第三步:创建类,在类上添加创建对象注解

    1. //在注解里面value属性值可以省略不写,默认值就是类名称,然后首字母小写
    2. @Service(value="userService") // 这句话=
    3. public class UserService {
    4. public void add(){
    5. System.out.println("service add........");
    6. }
    7. }

    然后进行测试

    1. @Test
    2. public void testService(){
    3. ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
    4. UserService userService = context.getBean("userService", UserService.class);
    5. System.out.println(userService);
    6. userService.add();
    7. }

    总结一下执行流程:

    首先我们在spring配置文件头文件要加context配置

    在测试类加载spring配置文件的时候,我们在spring配置文件中只写了一段代码,就是开启组件扫描,当这一生效,spring就知道我们是用注解方式来做,它会到我们配置的包里面找到包的所有类,如果说类上面有相关的注解,那么就根据注解的方式把对象创建,对象创建之后就可以调用输出等。

    注解有四种方式,都可以创建对象,只不过在不同层中,让开发人员更加清晰当前组件所扮演的角色,为了代码规范,最好我们都在不同场景运用不同注解。


    Spring中组件扫描的细节

    在后续的开发中,只要开启扫描了,就会在对应的包下扫描所有的类

    以下举个例子,以后会在SpringMVC中用到:

    示例1

    前面基本还是一样的,只是在context里面多个了:use-default-filters="false"

    use-default-filters="false"是干嘛的?
    这表示不是用默认filter,而是使用我们自己配置的filter,那怎么配置规则?

    里面可以这样写

    1. <context:component-scan base-package="com.godairo.spring5" use-default-filters="false">
    2. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    3. context:component-scan>

    context:include-filter:设置扫描哪些内容,type是根据注解来扫描

    这段代码连起来的意思就是,并不是去base-package下扫描所有的类,而是只扫描带这个注解的类,也就是Controller注解的类

    以上是示例1

    示例2

    1. <context:component-scan base-package="com.godairo.spring5">
    2. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    3. context:component-scan>

    这个示例就不写use-default-filters="false",这就代表着扫描这个包下的所有。

    但是里面还有一个,这个的意思是不包含,也就是说,扫描这个包下的所有,但是不去扫context:exclude-filter里面所指定的注解,也就是Controller。


    总结一下

    示例1加上use-default-filters="false",不去扫描包下所有的类,但是可以去扫描context:include-filter指定的注解。

    而示例2就是全部扫描,不会去扫描context:include-filter指定的注解。

    基于注解方式实现属性注入(注入属性@AutoWired和Qualifier)

    (1)@AutoWired:表示根据属性类型进行自动装配
    (2)@Qualifier:根据属性名称进行注入
    (3)@Resource:可以根据类型注入,可以根据名称注入

    以上这三个类型都是根据对象类型进行注入

    (4)@Value:注入普通类型属性


    (1)@AutoWired:表示根据属性类型进行自动装配

    第一步:把service和dao对象创建,在service和dao的类添加创建对象注解.

    1. public interface UserDao {
    2. public void add();
    3. }
    1. @Repository(value = "userDaoImpl")
    2. public class UserDaoImpl implements UserDao{
    3. @Override
    4. public void add() {
    5. System.out.println("dao add......");
    6. }
    7. }

    第二步:在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解,这里我们可以不用set,因为在注解里已经完成了 

    1. @Service(value = "userService") // 这句话=
    2. public class UserService {
    3. //定义dao类型属性
    4. //不需要添加set方法
    5. //添加注入属性注解
    6. @AutoWired
    7. private UserDao userDao;
    8. public void add() {
    9. System.out.println("service add........");
    10. userDao.add();
    11. }
    12. }

    接下来进行测试

     


    (2)@Qualifier:根据属性名称进行注入 

    这个@Qualifier注解的使用,和上面@Autowired一起使用。

    这里具体的意思就是,比如说UserDao是一个接口,但是此时它的实现类有很多个,比如UserDaoImpl1,UserDaoImpl2.......,此时@AutoWired不知道去找哪一个,这时候就要配合@Qualifier去进行使用。

    这里我们多写一个UserDaoImpl2去实现UserDao接口

    1. @Repository(value = "userDaoImpl2")
    2. public class UserDaoImpl2 implements UserDao {
    3. @Override
    4. public void add() {
    5. System.out.println("userDaoimpl2 add....");
    6. }
    7. }

     然后在service里面这么写

    1. //在注解里面value属性值可以省略不写,默认值就是类名称,然后首字母小写
    2. @Service(value = "userService") // 这句话=
    3. public class UserService {
    4. //定义dao类型属性
    5. //不需要添加set方法
    6. //添加注入属性注解
    7. @Autowired //根据类型进行注入
    8. @Qualifier(value = "userDaoImpl2")
    9. private UserDao userDao;
    10. public void add() {
    11. System.out.println("service add........");
    12. userDao.add();
    13. }
    14. }

    最后测试一下

     

    Bean管理注解方式(注入属性@Resource和Value)

    (3)@Resource:可以根据类型注入,可以根据名称注入

    1. @Resource(name="userDaoImpl2")
    2. private UserDao userDao;

    测试一下

    这里需要注意的是,Spring官方提醒我们最好是@Qualifier和@AutoWired一起使用。因为@Resource是java里面自带的。

     


     (4)@Value:注入普通类型属性

    1. //在注解里面value属性值可以省略不写,默认值就是类名称,然后首字母小写
    2. @Service(value = "userService") // 这句话=
    3. public class UserService {
    4. @Value(value="GodAiro")
    5. private String name;
    6. //定义dao类型属性
    7. //不需要添加set方法
    8. //添加注入属性注解
    9. @Resource(name="userDaoImpl2")
    10. private UserDao userDao;
    11. public void add() {
    12. System.out.println("service add........"+name);
    13. userDao.add();
    14. }
    15. }

    这里声明一个name属性并且加上Value注解,里面附上值,然后在add方法里输出,我们也进行测试

     

    Bean管理注解开发(完全注解开发)

    在之前我们配置文件里开启了自动扫描注解,那么我们现在把这个步骤放在配置类里,替代xml配置文件。

    创建一个包,用于放配置类

    SpringConfig.java

    1. @Configuration //作为配置类,替代xml配置文件
    2. @ComponentScan(basePackages = {"com.godairo.spring5"})
    3. public class SpringConfig {
    4. }

    在类的上方需要加2个注解,一个是@Configuration,这是作为配置类,替代xml配置文件

    还有一个是@ComponentScan,这是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中,我们可以看一下之前的spring配置文件xml中的内容

    <context:component-scan base-package="com.godairo.spring5">context:component-scan>

    这是我们之前在xml中开启注解模式,而@ComponentScan就是这个功能。

  • 相关阅读:
    09_上传漏洞_文件包含&二次渲染&代码逻辑漏洞
    SPA项目开发 - 登录注册功能
    K8S实战 - 如何在kubernetes中安装软件
    创业公司的十种死法
    Python 轻松生成PDF文档
    vue 封装水球图
    Python:熬夜把内置库函数整理成合集了,不要错过 ❢
    QT--线程
    Strtok函数切割字符串(附代码演示)
    五、Vue3基础之五
  • 原文地址:https://blog.csdn.net/qq_44706176/article/details/126110865