博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring IoC — 基于注解的配置
阅读量:6976 次
发布时间:2019-06-27

本文共 8285 字,大约阅读时间需要 27 分钟。

原文:

基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现。

@Component:对类进行标注,Spring容器自动将POJO转换为容器管理的Bean;
@Repository:用于对DAO实现类进行标注;
@Service:用于对Service实现类进行标注;
@Controller:用于对Controller实现类进行标注。
 
1、自动装配Bean:
 
beans.xml:

 LogDao类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;@Component("logDao")public class LogDao {}

UserDao_1类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;@Component("userDao_1")//自动被Spring容器识别,Spring容器自动将POJO转换为容器管理的Bean//等价于XML配置的
public class UserDao_1 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "UserDao_1{" + "name='" + name + '\t' + '}'; } public UserDao_1() { System.out.println("userDao"); }}

UserDao_2类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;/** * Created by gao on 16-3-25. */@Component("userDao_2")public class UserDao_2 {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "UserDao_2{" +                "name='" + name + '\t' +                '}';    }    public UserDao_2() {        System.out.println("userDao_2");    }}

UserDao_3类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;/** * Created by gao on 16-3-25. */@Component("userDao_3")public class UserDao_3 {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "UserDao_3{" +                "name='" + name + '\t' +                '}';    }    public UserDao_3() {        System.out.println("userDao_3");    }}

LogonService类:

package com.ioc.ch4_10;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;@Servicepublic class LogonService{    //使用@Autowired进行自动注入    @Autowired    private LogDao logDao;    @Autowired    private UserDao_1 userDao1;    //使用@Autowired的required属性,设置为false表示找不到匹配的Bean完成注入也不要抛出异常    @Autowired(required = false)    private UserDao_2 userDao_2;    //使用@Qualifier指定注入Bean的名称    @Autowired    @Qualifier("userDao_3")    private UserDao_3 userDao_3;    public LogDao getLogDao() {        return logDao;    }    public UserDao_1 getUserDao1() {        return userDao1;    }    public UserDao_2 getUserDao2() {        return userDao_2;    }    public UserDao_3 getUserDao3() {        return userDao_3;    }    public void printSomething(){        userDao1.setName("LogonService-userDao1");        System.out.println(userDao1.toString());        userDao_2.setName("LogonService-userDao2");        System.out.println(userDao_2.toString());        userDao_3.setName("LogonService-userDao3");        System.out.println(userDao_3.toString());    }}

LoginService_2类:

package com.ioc.ch4_10;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;/** * Created by gao on 16-3-25. */@Servicepublic class LogonService_2 {    private LogDao logDao;    private UserDao_1 userDao_1;    //自动将LogDao传给方法入参    @Autowired    public void setLogDao(LogDao logDao) {        System.out.println("auto setlogdao");        this.logDao = logDao;    }    //自动将名为userDao的Bean传给方法入参    @Autowired    public void setUserDao_1(UserDao_1 userDao_1) {        System.out.println("auto setuserdao");        this.userDao_1 = userDao_1;    }    @Autowired    public void init(@Qualifier("userDao_1")UserDao_1 userDao,LogDao logDao){        System.out.println("multi param inject");        this.userDao_1 = userDao;        this.logDao =logDao;    }}

测试类:

package com.ioc.ch4_10;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by gao on 16-3-25. */public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\beans.xml");        LogonService ls = (LogonService) ctx.getBean("ls");        ls.printSomething();    }}

 

输出结果:
userDao
userDao_2
userDao_3
multi param inject
auto setlogdao
auto setuserdao
UserDao_1{name='LogonService??userDao1}
UserDao_2{name='LogonService-userDao2
}
UserDao_3{name='LogonService-userDao3
}
 
 
2、对集合类进行标注
Plugin接口:
package com.ioc.ch4_10;public interface Plugin {}

 onePlugin类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;@Componentpublic class OnePlugin implements Plugin {}

twoPlugin类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;@Componentpublic class TwoPlugin implements Plugin {}

MyComponent类:

package com.ioc.ch4_10;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.List;@Componentpublic class MyComponent {    //Spring会将容器中所有类型为Plugin的Bean注入到这个变量中    @Autowired(required=false)    private List
plugins; public List
getPlugins() { return plugins; }}

mycomponent.xml:

MyComponentTest类:

package com.ioc.ch4_10;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyComponentTest {    public static void main(String[] args) throws Throwable {        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\mycomponent.xml");        MyComponent myComponent = ctx.getBean(MyComponent.class);        System.out.println("pulgin.size:"+myComponent.getPlugins().size());            }}
输出结果:
userDao
userDao_2
userDao_3
multi param inject
auto setlogdao
auto setuserdao
pulgin.size:2
 
3、Bean作用范围及生命过程方法
使用Scope指定作用范围
package com.ioc.ch4_10;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;//指定Bean的作用范围为prototype@Scope(BeanDefinition.SCOPE_PROTOTYPE)@Componentpublic class Car {    private int maxSpeed;    public String brand;    private double price;        ......}

 

 Boss类:

package com.ioc.ch4_10;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;import javax.annotation.Resource;@Componentpublic class Boss {        private Car car;    public Boss(){        System.out.println("construct...");    }    @Resource    private void setCar(Car car){        System.out.println("execute in setCar");        this.car = car;    }        @PostConstruct    private void init1(){        System.out.println("execute in init1");    }        @PostConstruct    private void init2(){        System.out.println("execute in init1");    }        @PreDestroy    private void destory1(){        System.out.println("execute in destory1");    }        @PreDestroy    private void destory2(){        System.out.println("execute in destory2");    }}

测试类:

package com.ioc.ch4_10;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by gao on 16-3-25. */public class Test {    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\beans.xml");        Car car1 = (Car) ctx.getBean("car");        Car car2 = (Car) ctx.getBean("car");        System.out.println(car1 == car2); //false        UserDao_2 ud1 = (UserDao_2) ctx.getBean("userDao_2");        UserDao_2 ud2 = (UserDao_2) ctx.getBean("userDao_2");        System.out.println(ud1 == ud2); //true        ((ClassPathXmlApplicationContext)ctx).destroy();    }}
输出结果:
construct...
execute in setCar
execute in init1
execute in init1
false
true
execute in destory2
execute in destory1

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://dhupl.baihongyu.com/

你可能感兴趣的文章
iOS多线程编程之NSOperation和NSOperationQueue的使用
查看>>
SAP QM 'QM System' 有什么控制作用?
查看>>
Health Check in eShop -- 解析微软微服务架构Demo(五)
查看>>
项目沟通管理计划
查看>>
[20160608]自治事务引起死锁.txt
查看>>
AliGenie AR Fuels the Ali New Retail Strategy - Interactive Marketing Activities
查看>>
一个最简单的通过WireShark破解SSL加密网络数据包的方法
查看>>
教你用TensorFlow和自编码器模型生成手写数字(附代码)
查看>>
荣之联“云桥OneBridge”让IT运维事半功倍
查看>>
中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.3 人工智能在各医学亚专科的发展态势...
查看>>
新技术、新思维开创公共安全管理新模式
查看>>
新产品发布与A轮2000万美元 双喜临门后GrowingIO还要做什么
查看>>
《大数据、小数据、无数据:网络世界的数据学术》一 导读
查看>>
玉山银行的一名新员工“玉山小i随身金融顾问”
查看>>
消除危害 让BYOD策略更安全的几个秘诀
查看>>
云端卫士架构师讲DDoS攻击的智能防御之道
查看>>
《算法技术手册》一2.4.6 二次方的算法性能
查看>>
物联网时代全面降临
查看>>
什么是新IP的四层网络技术
查看>>
大数据流通存隐忧 产业信任体系亟待建立
查看>>