我們都知道IoC是控制反轉的,也就是我們只需要把類注冊到Spring容器中,他可以幫助我們創建對象,該創建的思想也就是走的構造器
通過XML
例如我們創建一個People對象,默認有一個無參構造
package com.hzy.pojo;
public class People {
}
然后我們通過XML將該類注冊到Spring中,這樣他就是一個bean了,并且被Spring管理
<bean id="people" class="com.hzy.pojo.People"/>
我們進行創建對象的時候,不用new了,而是在Spring容器中拿
ApplicationContext context2 = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = context2.getBean("people", People.class);
通過注解
在用注解之前,我們需要先打開注解的支持和注解要掃描的包
<!-- 開啟注解支持-->
<context:annotation-config/>
<!-- 配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy.pojo"/>
機械設備裝配與自動控制。然后創建類,通過@Component注入到Spring,與此作用一樣的還有@Service、@Controller、@Repository
package com.hzy.pojo;import org.springframework.stereotype.Component;@Component
public class People {
}
獲取的時候同樣
ApplicationContext context2 = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = context2.getBean("people", People.class);
System.out.println(people);
通過完全注解
首先我們需要創建一個配置類AppConfig,名字可以隨便取,在這個配置類中,就把要注入Spring中的類當作一個bean了
package com.hzy.config;import com.hzy.pojo.People;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic People people() {return new People();}
}
然后就只需要創建一個類,這里不用@Component注解了,因為在配置類中已經指定類了。
package com.hzy.pojo;public class People {
}
最后測試的時候用AnnotationConfigApplicationContext
ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
People people = context2.getBean("people", People.class);
依賴注入這里主要講解set注入和構造器注入
set注入
在我們進行XML創建對象的時候,我們可以通過property標簽進行值得注入
首先我們創建一個普通的實體類
package com.hzy.pojo;public class Student {private String name;private int age;// get set tostring 省略
}
jdbctemplate連接池,然后在XML中進行配置即可
<bean id="student" class="com.hzy.pojo.Student"><property name="name" value="張三"/><property name="age" value="18"/>
</bean>
另外,我們還可以通過p(property)命名空間
<bean id="student" class="com.hzy.pojo.Student" p:name="張三" p:age="18"/>
記得引入一個頭文件
xmlns:p="http://www.springframework.org/schema/p"
另外我們還可以通過注解進行注入
首先在XML中開啟注解并配置要掃描的包
<!-- 開啟注解支持-->
<context:annotation-config/>
<!-- 配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy.pojo"/>
注解可以寫到屬性上,也可以寫到set方法上
package com.hzy.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class Student {@Value("張三")private String name;@Value("18")private int age;// 省略get set toString
}
我們還可以通過無配置文件注入,也就是先創建一個配置類,可以通過@ComponentScan配置要掃描的包,不配默認全部掃描
package com.hzy.config;import com.hzy.pojo.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.hzy.pojo"})
public class AppConfig {@Beanpublic Student student() {return new Student();}
}
構造器注入
構造器注入需要我們提供一個有參構造方法
package com.hzy.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;public class Teacher {private String name;private Integer age;public Teacher(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +'}';}
}
在配置文件中通過constructor-arg屬性注入值
<bean id="teacher" class="com.hzy.pojo.Teacher"><constructor-arg name="name" value="張三"/><constructor-arg name="age" value="18"/>
</bean>
裝配。或者通過c(constructor-arg)命名空間
<bean id="teacher" class="com.hzy.pojo.Teacher" c:name="張三" c:age="18"/>
首先說Bean的作用域,常用的有singleton單例,prototype原型,也就是多例
<bean id="teacher" class="com.hzy.pojo.Teacher" scope="singleton"/>
<bean id="teacher" class="com.hzy.pojo.Teacher" scope="prototype"/>
如果有線程安全問題,用prototype
另外就是關于Bean的生命周期,一共可以分為七步
1、構造器構造實例
2、注入值
3、初始化之前執行后置處理器的before方法,即實現BeanPostProcesser
4、初始化init-method
5、初始化之后執行后置處理器的after方法,即實現BeanPostProcesser
6、可以使用
7、銷毀destory-method
我們可以在配置文件中配置
<bean id="teacher" class="com.hzy.pojo.Teacher" autowire="byType"/>
<bean id="teacher" class="com.hzy.pojo.Teacher" autowire="byName"/>
但是我們一般都是用注解
@Autowired 默認是byType,可以通過@Qualifile為byName
@Resource 默認是byName,找不到自動byType
舉例:我們頭通過自動裝配在service層注入dao
首先在配置文件中開啟注解的支持和要掃描的包,這里也可以通過配置類
<!-- 開啟注解支持-->
<context:annotation-config/>
<!-- 配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy"/>
首先我們寫一個UserDao接口
package com.hzy.dao;public interface UserDao {public void add();
}
然后寫一個實現類,該類通過@Repository注入到Spring中
package com.hzy.dao;import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao {public void add() {System.out.println("add ...");}
}
然后就是業務層@Service,調用dao層,此處自動裝配的UserDao
package com.hzy.service;import com.hzy.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;public void add() {userDao.add();}
}
自動裝配線、最后測試
public class MyTest {@Testpublic void myTest() {ApplicationContext context1 = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = context1.getBean("userService", UserService.class);userService.add();}
}
如果我們在UserDaoImpl指定name的名字,然后并且用@AutoWired裝配
@Repository("abc")
public class UserDaoImpl implements UserDao {public void add() {System.out.println("add ...");}
}
@Service
public class UserService {@Autowired@Qualifier("abc") //與上面的對應private UserDao userDao;public void add() {userDao.add();}}
同時我們也可以通過@Resource
@Service
public class UserService {// @Autowired
// @Qualifier("abc")@Resource(name = "abc")private UserDao userDao;public void add() {userDao.add();}}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态