Spring Ioc的實現----------用idea實現控制反轉

1.概要:什麼爲Ioc,以及原理

    

2.Ioc的實現

        2.1準備工做

                   2.1.1 jar  包:java

        此外,還加上commons-logging和log4j日誌包spring

                2.1.2用idea建立工程 數組

                    

                    2.1.3勾選自動生成目錄結構,不然要本身建立ide

           

                2.1.4將jar包放入到項目中函數

                    

                    2.1.5須要注意的是 若是是在test目錄裏面寫測試代碼,jar包必定也要添加到spring_test裏面去,否者會一直報錯建立不了bean的錯誤測試

                

         2.2 開始幹活

            a.基於xml的方式進行注入

                        2.2.1對無參構造函數進行注入

a.在java下建立User類this

//1.建立對象
public class User {
    public void add(){
        System.out.println("添加一個用戶");
    }
}

 b. 在resources下建立bean1.xml,添加以下idea

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

  c. 在 test目錄下建立TestIoc進行測試 ,點擊運行spa

//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.建立類prototype

/**
 * 構造函數注入
 */
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();
}
相關文章
相關標籤/搜索