Spring ioc-idea实现控制反转

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

    Spring ioc-idea实现控制反转

2.Ioc的实现

        2.1准备工作

                   2.1.1 jar  包:

Spring ioc-idea实现控制反转

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

                2.1.2用idea创建工程 

                    Spring ioc-idea实现控制反转

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

            Spring ioc-idea实现控制反转

                2.1.4将jar包放入到项目中

                    Spring ioc-idea实现控制反转

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

                Spring ioc-idea实现控制反转

         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();
}