Spring Ioc的实现----------用idea实现控制反转

本文详细介绍了Spring框架中的IoC容器概念及其工作原理,包括XML配置方式、注解方式实现依赖注入的方法,并提供了具体的代码示例。

1.概要:什么为Ioc,以及原理

    091829_pw2q_3745828.png

2.Ioc的实现

        2.1准备工作

                   2.1.1 jar  包:

092545_n1W7_3745828.png

        此外,还加上commons-logging和log4j日志包

                2.1.2用idea创建工程 

                    092824_Ykxb_3745828.png

                    2.1.3勾选自动生成目录结构,否则要自己创建

            092922_QA2I_3745828.png

                2.1.4将jar包放入到项目中

                    093108_QyQs_3745828.png

                    2.1.5需要注意的是 如果是在test目录里面写测试代码,jar包一定也要添加到spring_test里面去,否者会一直报错创建不了bean的错误

                093254_Ncip_3745828.png

         2.2 开始干活

            a.基于xml的方式进行注入

                        2.2.1对无参构造函数进行注入

a.在java下创建User类

//1.创建对象
public class User {
    public void add(){
        System.out.println("添加一个用户");
    }
}

 b. 在resources下创建bean1.xml,添加如下

<!--ioc入门-->
 <!--2.配置对象-->
<bean id="user" class="com.xiaobo.Bean.User" scope="prototype"></bean>

  c. 在 test目录下创建TestIoc进行测试 ,点击运行

//3.测试
public class TestIoc {

    @Test
    public void test(){
        //加载xml文件
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean1.xml");
        User user = (User) ac.getBean("user");

        user.add();
    }
}

     2.2.2对有参构造函数进行注入

        a.创建类

/**
 * 构造函数注入
 */
public class PropertyDemo1 {
    public PropertyDemo1(String name) {
        this.name = name;
    }

    private  String name;
    public void test(){
        System.out.println("my name is :"+this.name);
    }
}            

     b.配置文件

<!--构造函数完成属性注入-->
    <bean id="name" class="com.xiaobo.Property.PropertyDemo1">
    <!--有参的构造函数,属性注入-->
    <constructor-arg value="jack" name="name" />
</bean>

  c.测试

@Test
public void test(){
    //加载xml文件
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean1.xml");
    PropertyDemo1 user = (PropertyDemo1) ac.getBean("name");
    user.test();
}

             2.2.3对set方法进行注入

         a.创建类

public class Book {
    public void setName(String name) {
        this.name = name;
    }

    private  String name;
    public  void test(){
        System.out.println("书名为: "+this.name);
    }

}

     b.配置文件

<!--set方法属性注入-->
<bean id="book" class="com.xiaobo.Property.Book">
    <!--用set方法完成属性注入,name为类中的成员变量-->
    <property name="name" value="易经经"></property>
</bean>

  c.测试

@Test
public void test(){
    //加载xml文件
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean1.xml");
    PropertyDemo1 user = (PropertyDemo1) ac.getBean("name");
    user.test();
}

    2.2.4对对象进行注入

  a.创建类

public class BookService {
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    private BookDao bookDao;

    public void add(){
        bookDao.add();
    }
}
public class BookDao {

    public void add(){
        System.out.println("添加书籍 ");
    }

}

b.配置文件

<!--对对象的注入-->
<bean id="bookDao" class="com.xiaobo.Property.BookDao">
</bean>
<bean id="bookService" class="com.xiaobo.Property.BookService">
    <!--ref是上面定义的-->
    <property name="bookDao" ref="bookDao"></property>
</bean>

  c.测试

@Test
public void test3(){
    //加载xml文件
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean1.xml");
    BookService user = (BookService) ac.getBean("bookService");
    user.add();
}

2.2.5对集合进行注入

a.创建类

public class Person {
    public void setArr(String[] arr) {
        this.arr = arr;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
    private String[] arr;
    private Map<String,String> map;
    private List<String> list;
    public void test(){
        System.out.println("arr is "+arr);
        System.out.println("map is "+map);
        System.out.println("list is "+list);
    }
}

b.配置文件

<bean id="arr" class="com.xiaobo.Property.Person">
    <!--数组的注入-->
    <property name="arr">
        <list>
            <value>123</value>
            <value>234</value>
            <value>34</value>
            <value>123</value>
        </list>
    </property>
    <property name="list">
        <list>
            <value>asd</value>
            <value>zc</value>
            <value>vfs</value>
            <value>ghj</value>
        </list>
    </property>
    <property name="map">
        <map>
            <entry key="abc" value="123"/>
            <entry key="456" value="再来一次"/>
            <entry key="10010" value="电信"/>
        </map>
    </property>
</bean>

  c.测试

@Test
public void test4(){
    //加载xml文件
    ApplicationContext ac=new ClassPathXmlApplicationContext("bean1.xml");
    Person user = (Person) ac.getBean("arr");
    user.test();
}

b.基于注解的注入

  b.1 创建新的xml文件 , xml配置,下面的代码会扫描具体包下的注解进行自动注入。

<!--开启注解扫描
在包里面属性,方法,类,是否有注解
-->
<context:component-scan base-package="com.xiaobo"></context:component-scan>

        b.2类中的注解

//业务层使用userService注解
@Service(value = "userService")
public class UserService {
    //使用了注解注入后就不用使用set方法了,比xml注入便捷许多
    //使用Autowired自动注入
//    @Autowired,只要是有UserDao这个类,就会注入,跟@Repository(value = "userDao")无关
//    private UserDao userDao;

    //指定@Repository(value = "userDao")的类
    @Resource(name = "userDao")
    private UserDao userDao;
    public void add(){
        userDao.add();
    }
}
//持久层的注解为Repository
@Repository(value = "userDao")
public class UserDao {

    public void add(){
        System.out.println("UserDao add user");
    }
}

b.3测试

@org.junit.Test
public void testService(){
    ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
    UserService user = (UserService) context.getBean("userService");
    user.add();
}

转载于:https://my.oschina.net/u/3745828/blog/1608279

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值