11.使用注解实现springIoC容器

三类注解

 组件类型注解-声明当前类的功能与职责

 自动装配注解-根据属性特征自动注入对象

 元数据注解-更细化地辅助IoC容器管理对象的注解

 

四种组件类型注解

 @Component 组件注解,通用注解被该注解描述的类将被IoC容器管理并实例化

 @Controller 语义注解,说明当前类是MVC应用中的控制器类

 @Service 语义注解说明当前类是Service业务服务类

 @Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类

 

复制代码
package com.spring.ioc.controller;

import org.springframework.stereotype.Controller;

@Controller
public class UserController {
}
----------------------------------------------
package com.spring.ioc.dao;

import org.springframework.stereotype.Repository;
//组件类型注解默认beanId为类名首字母小写
@Repository
public class UserDao {
}
----------------------------------------------
package com.spring.ioc.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
}
----------------------------------------------
package com.spring.ioc.utils;

import org.springframework.stereotype.Component;

@Component
public class StringUtils {
}
复制代码
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <!--在IoC容器初始化时自动扫描四种组件类型注解并完成实例化
        @Repository
        @Service
        @Controller
        @Component
    -->
    <context:component-scan base-package="com.spring"/>
</beans>
复制代码
复制代码
package com.spring.ioc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        String[] ids = context.getBeanDefinitionNames();
        for(String id : ids){
            System.out.println(id + ":" + context.getBean(id));
        }
    }
}
复制代码

 

两类自动装配注解

 按类型装配

  @Autowired 按容器内对象类型动态注入属性由Spring机构提供

  @inject 基于JSR-330(Dependency Injection for Java)标准,其他同@ Autowired,但不支持required属性

 按名称装配

  @Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性

  @Resource 基于JSR-250规范,优先按名称、再按类型智能匹配

 在属性名和set方法上增加装配注解都可以完成对象的注入,如果装配注解放在set方法上,则自动按类型/名称对set方法参数进行注入,如果装配注解放在属性名上,Spring IoC容器会自动通过反射技术将属性private修饰符自动改成public,直接进行赋值,不再执行set方法,基于注解完成对象依赖注入,通常不会生成set方法,直接在属性上增加装配注解。

复制代码
package com.spring.ioc.service;

import com.spring.ioc.dao.IUserDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class DepartmentService {
    /**
     * 1.@Resource设置name属性,则按name在IoC容器中将bean注入
     * 2.@Resource未设置name属性
     *   以属性名作为bean name在IoC容器中匹配 bean,如有匹配则注入
     *   按属性名未匹配,则按类型进行匹配,同 @Autowired,需加入@Primary解决类型冲突
     * 在使用@Resource对象时推荐设置name或保证属性名与bean名称一致
     */
//    @Resource(name = "userOracleDao")
//    private IUserDao userDao;
    @Resource
    private IUserDao userOracleDao;

    public void joinDepartment(){
        System.out.println(userOracleDao);
    }
}
DepartmentService
复制代码
复制代码
package com.spring.ioc.dao;

import org.springframework.stereotype.Repository;
//组件类型注解默认beanId为类名首字母小写
@Repository
public class UserDao implements IUserDao{
    public UserDao(){
        System.out.println("正在创建UserDao对象:"+this);
    }
}
UserDao
复制代码
复制代码
package com.spring.ioc.dao;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

@Repository
@Primary
public class UserOracleDao implements IUserDao{
    public UserOracleDao(){
        System.out.println("正在创建UserOracleDao对象"+this);
    }
}
UserOracleDao
复制代码
复制代码
package com.spring.ioc;

import com.spring.ioc.service.DepartmentService;
import com.spring.ioc.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//        String[] ids = context.getBeanDefinitionNames();
//        for(String id : ids){
//            System.out.println(id + ":" + context.getBean(id));
//        }
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService.getUserDao());
        DepartmentService departmentService = context.getBean("departmentService", DepartmentService.class);
        departmentService.joinDepartment();
    }
}
SpringApplication
复制代码

 

元数据注解

 @Primary 按类型装配时出现多个相同类型对象拥有此注解对象优先被注入

 @PostConstruct 描述方法,相当于XML中init-method配置的注解版本

 @PreDestroy 描述方法,,相当于XML中destroy-method配置的注解版本

 @Scope 设置对象的scope属性

 @Value 为属性注入静态数据

 

posted @   南风知君  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示