栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java - 框架 - Spring(IOC)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java - 框架 - Spring(IOC)

Java - 框架 - Spring(IOC) 一、项目搭建
  1. 添加依赖

    
        
        
            org.springframework
            spring-context
            5.2.17.RELEASE
        
        
            junit
            junit
            4.13.2
        
    
    
  2. 添加spring配置文件

    
    
    
    
    
    
二、基于XML配置文件实现IOC 2.1 基本使用
  1. 配置文件

        
        
        
        
    
        
        
            
            
        
    
  2. 测试代码

    @Test
    public void fun1(){
        //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    
        User user1 = (User) ac.getBean("user1");
        User user2 = (User) ac.getBean("user2");
        user1.say();
        System.out.println(user1);
        System.out.println(user2);
    }
    
2.2 获取对象方式
  1. 根据id获取
  2. 根据name获取
  3. 根据类型获取
  • id和name的区别

    
    
    
  • 根据类型获取的缺点

    根据类型获取的对象,如果容器中有两个对象,则会报错

  • 测试代码

    @Test
    public void fun1(){
        User user1 = (User) ac.getBean("u1");
        //根据name
        User user2 = (User) ac.getBean("user2");
        //根据id
        User user3 = (User) ac.getBean(User.class);
        //根据类型,如果bean中的类不唯一,会报错
        User user4 = ac.getBean("u1",User.class);
        //根据组合条件查询
    }
    
    
    
    
    
2.3 工厂注入 2.3.1 静态工厂注入
  • 工厂类

    public class StaticFactoryDemo {
    
        public static User getInstance(){
            return new User();
        }
    }
    
  • 配置文件

    
    
    
  • 测试类

    @Test
    public void fun3(){
        //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用
        ac = new ClassPathXmlApplicationContext("applicationContext-staticfactory.xml");
        User user1 = (User) ac.getBean("user");
        user1.say();
    }
    
2.3.2 动态工厂注入
  • 工厂类

    public class DynamicFactoryDemo {
    
        
        public User getInstance(){
            return new User();
        }
    }
    
  • 配置文件

    
    
    
    
    
    
    
  • 测试类

    @Test
    public void fun4(){
        //1.容器初始化,解析 applicationContext.xml 配置文件,此时构造方法就会被调用
        ac = new ClassPathXmlApplicationContext("applicationContext-staticfactory.xml");
        User user1 = (User) ac.getBean("user");
        user1.say();
    }
    
3. 属性注入(DI)

属性注入,主要指如何给对象中的属性赋值

3.1 构造注入

前提是对象需要有相关的构造方法

  • pojo对象

    //提供构造方法....
    public User(Integer age, Integer id) {
        this.age = age;
        this.id = id;
    }
    
    public User(String name, Integer age, Integer id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }
    
  • 配置文件

    
        
        
        
    
    
    
    
        
        
        
        
        
        
        
    
    
3.2 设值注入

前提是对象需要有相关的setter方法

  • pojo对象

    private String name;
    private Integer age;
    private Integer id;
    //省略getter 和 setter
    
  • xml

    
        
        
        
    
    
4. 常见数据类型注入
  1. 实体类

    private Cat cat;
    
    private String [] hobbies;
    
    private List cats;
    
    private Map maps;
    
    private Properties pops;
    
  2. 对象注入

    
    
        
            
                
                
            
        
    
    
    
        
        
    
    
    
    
        
        
    
    
  3. 数组注入

    
        
            篮球
            爬山
            逛街
        
    
    
  4. 集合注入

    
        
            
                
                
            
            
        
    
    
  5. Map注入

    
        
            
            
            
        
    
    
  6. properties注入

    
        
            root
            123
        
    
    
三 、基于JAVA配置实现IOC 3.1 获取对象
  • 配置类

    import com.spring.pojo.User;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    
    @Configuration
    public class JavaConfig {
    
        
        @Bean(name = "user")//自定义name,可以通过ac.getBean(),获得对象
        //@Bean(name = {"user","user1"})
        //@Bean({"user","user1"})
        public User getUser(){
            User user = new User();
            user.setName("abaaba");
            return user;
        }
    
    }
    
  • 实现类

    @Test
    public void fun1(){
        //1.容器初始化,加载配置类
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        User user1 = ac.getBean(User.class);
        User user2 = (User)ac.getBean("user");
        User user3 = (User)ac.getBean("bbbb");
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user3);
    }
    
3.2 配置文件和配置类案例分析
  • controller

    public class UserController {
    
        //因为要使用service对象,所以需要属性注入,这里使用设值注入
        private IUserService service;
        
        public List query(){
            return service.query();
        }
    
        public IUserService getService() {
            return service;
        }
    
        public void setService(IUserService service) {
            this.service = service;
        }
    }
    
  • service

    public interface IUserService {
        public List query();
    }
    
    public class UserServiceImpl implements IUserService {
    
        //因为要使用dao对象,所以需要属性注入,这里使用设值注入
        private IUserDao dao;
    
        public List query() {
            return dao.query();
        }
    
        public IUserDao getDao() {
            return dao;
        }
    
        public void setDao(IUserDao dao) {
            this.dao = dao;
        }
    }
    
  • dao

    public interface IUserDao {
        public List query();
    }
    
    public class UserDaoImpl implements IUserDao {
        public List query() {
        	//假设从数据库获取的内容
            List users = new ArrayList();
            users.add(new User(1,"1111"));
            users.add(new User(2,"2222"));
            users.add(new User(3,"3333"));
            return users;
        }
    }
    
3.2.1基于Xml配置文件的示例代码
  • xml配置文件

    
        
        
    
    
    
    
        
        
    
    
    
    
    
  • 测试代码

    @Test
    public void fun1(){
        //1.容器初始化,加载配置类
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
        UserController controller = (UserController)ac.getBean("userController");
        System.out.println(controller.query());
    }
    
3.2.2 基于Java配置类的示例代码
  • javaconfig

    import com.spring.controller.UserController;
    import com.spring.dao.IUserDao;
    import com.spring.dao.impl.UserDaoImpl;
    import com.spring.service.IUserService;
    import com.spring.service.impl.UserServiceImpl;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    
    @Configuration
    public class JavaConfig {
    
        @Bean
        public UserController userController(IUserService iUserService){
            UserController controller = new UserController();
            controller.setService(iUserService);
            return controller;
        }
    
        @Bean
        public IUserService userService(IUserDao iUserDao){
            IUserService service = new  UserServiceImpl();
            ((UserServiceImpl) service).setDao(iUserDao);
            return service;
        }
    
        @Bean
        public IUserDao userDao(){
            return new UserDaoImpl();
        }
    }
    
  • 测试类

    @Test
    public void fun1(){
        //1.容器初始化,加载配置类
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        UserController controller = ac.getBean(UserController.class);
        System.out.println(controller.query());
    }
    
四、注解编程 4.1 基于配置文件方式的注解编程
  • controller

    @Controller
    public class UserController {
    
        @Autowired
        private IUserService service;
    
        public List query(){
            return service.query();
        }
    }
    
  • service

    @Service
    public class UserServiceImpl implements IUserService {
    
        @Autowired
        private IUserDao dao;
    
        public List query() {
            return dao.query();
        }
    }
    
  • dao

    @Repository
    public class UserDaoImpl implements IUserDao {
        public List query() {
            List users = new ArrayList();
            users.add(new User(1,"1111"));
            users.add(new User(2,"2222"));
            users.add(new User(3,"3333"));
            return users;
        }
    }
    
  • applicationContext.xml

    
    
        
        
    
    
    
    
    
        
        
    
    
  • 测试类

    @Test
    public void fun1(){
        //1.容器初始化,加载配置类
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
        UserController controller = (UserController)ac.getBean("userController");
        System.out.println(controller.query());
    }
    
4.2 基于Java配置类方式的注解编程
  • controller

    @Controller
    public class UserController {
    
        @Resource(type =IUserService.class,name = "userServiceImpl")
        //name对象是接口的实现类,不是接口
        private IUserService service;
    
        public List query(){
            return service.query();
        }
    }
    
  • service

    @Service
    public class UserServiceImpl implements IUserService {
    
        @Autowired
        //自动装配
        @Qualifier("dao")
        //当有多个bean对象的时候,指定唯一名称进行查找
        private IUserDao dao;
    
        public List query() {
            return dao.query();
        }
    }
    
  • dao

    @Repository
    public class UserDaoImpl implements IUserDao {
        public List query() {
            List users = new ArrayList();
            users.add(new User(1,"1111"));
            users.add(new User(2,"2222"));
            users.add(new User(3,"3333"));
            return users
        }
    }
    
  • Java配置类

    @Configuration
    //@ComponentScan(useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)})
    //单个扫描路径,不配置内容表示扫描全部路径
    //includeFilters = {@ComponentScan.Filter(Controller.class)}中使用的是注解的类,比如Controller.class,
    //@ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})})
    
    @ComponentScans({@ComponentScan(basePackages = "com.spring", useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}),
            @ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})})
    //配置多个扫描路径
    public class JavaConfig {
    
    }
    
  • 测试代码

    @Test
    public void fun1(){
        //1.容器初始化,加载配置类
        ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
        UserController controller = ac.getBean(UserController.class);
        System.out.println(controller.query());
    }
    
4.3 注解详解 4.3.1 IOC管理注解
  1. @Component

    泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

  2. @Controller

    用于标注控制层组件

  3. @Service

    用于标注业务层组件

  4. @Repository

    用于标注数据访问组件,即DAO组件

4.3.2 依赖注入注解
  1. @Autowired

@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

  1. @Qualifier

    如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称,一般情况下和@Autowired一起使用

  2. @Resource

    默认使用类型查找对象,但是提供name用于根据名称查找,等同于@Qualifier,提供type用于根据类型查找,等同于 @Autowired

  3. @Primary

    自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

4.3.3 @Value

为属性动态设值

@Component
public class UserBean {

    @Value("王尼玛")//注入普通字符串
    private String userName;

    @Value("#{systemProperties['os.name']}")//注入系统信息
    private String systemPropertiesName;

    @Value("#{T(java.lang.Math).random()*100}")//注入表达式结果
    private double randomNumber;

    @Value("#{cat.nick}")//注入其他bean的属性
    private String fromCatName;

    @Value("calsspath:applicationContext-xml.xml")//注入文件
    private Resource resourceFile;

    @Value("http://baidu.com")
    private Resource image;
    
    ...
    //省略getter、setter、toString
}
4.3.4 @PropertySource

读取第三方文件中的信息

  • 配置类

    @Configuration
    //@ComponentScan(useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)})
    //单个扫描路径,不配置内容表示扫描全部路径
    //includeFilters = {@ComponentScan.Filter(Controller.class)}中使用的是注解的类,比如Controller.class,
    //@ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)})})
    
    @ComponentScans({@ComponentScan(basePackages = "com.spring", useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(Controller.class)}),
            @ComponentScan(basePackageClasses = {UserDaoImpl.class,UserServiceImpl.class},useDefaultFilters = true,excludeFilters = {@ComponentScan.Filter(Controller.class)}),
            @ComponentScan(basePackages = "com.spring.pojo")})
    //配置多个扫描路径
    @PropertySource("classpath:jdbc.properties")
    //指定加载的属性文件
    public class JavaConfig {
    
    }
    
  • bean对象

    @Value("${JDBC_DRIVER}")
    private String DriverManager;
    
    @Value("${JDBC_URL}")
    private String jdbcUrl;
    

    在获得数据的时候,可以使用@Value注解获得数据

4.3.5 @Lazy

表示延迟初始化

@Test
public void fun1(){
    //1.容器初始化,加载配置类
    ApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
    //在执行配置文件读取的时候,就会初始化对象
    System.out.println("IOC初始化完成了");
    Cat cat = ac.getBean("cat",Cat.class);
}
  • 不加@Lazy注解

    Cat初始化

    IOC初始化完成了

  • 加@Lazy注解

    IOC初始化完成了
    Cat初始化

  • 特殊情况

    延迟加载的类,在其他类中被使用,延迟加载失效

4.3.6 生命周期注解
  1. @PostConstruct

    系统初始化之后执行的方法

    @PostConstruct
    public void init(){
        System.out.println("系统初始化方法");
    }
    
  2. @PreDestroy

    系统销毁之后执行的方法

    @PreDestroy
    public void destroy(){
        System.out.println("系统被销毁了");
    }
    
  3. @DependsOn

    更改初始化顺序

    不加@DependsOn注解时候,初始化顺序随机

    系统初始化方法
    Cat初始化
    User初始化

    在cat类上添加@DependsOn注解,使其依赖于user,指定user在cat类之前初始化

    @Component
    @DependsOn("user")
    public class Cat {
    }
    

    系统初始化方法
    User初始化
    Cat初始化

五、源码分析
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336909.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号