1.构造器的注入:
构造器属性注入 一般不使用,有太多的弊端,参数的注入太麻烦,还有顺序要求,一旦几个参数与构造器传入的参数顺序 不 一 样就会报错,避免这种情况,需要加入index=“传入参数的顺序”,这种方式也是不可取的,多少个参数要定义多少个index
java代码Bean类:
public class Bean6 {
private String name;
private Integer age;
public Bean6(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void fn() {
System.out.println("fn6+.."+name +age);
}
xml代码:
<bean id="bean6" class="com.array.ioc.bean.xml.di.Bean6">
<constructor-arg type="java.lang.String" index="0" value="array"></constructor-arg>
<constructor-arg type="java.lang.Integer" index="1" value="5"></constructor-arg>
</bean>
测试代码:
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");
Bean6 bean6 = (Bean6) act.getBean("bean6");
bean6.fn();
2.setter注入
java代码Bean类:
public class Bean7 {
private String name;
private int age;
private Bean8 bean8;
public void setBean8(Bean8 bean8) {
this.bean8 = bean8;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void fn() {
System.out.println("bean7 " +name +age+bean8);
}
}
xml代码:
<!-- setter注入 -->
<bean id="bean7"
class="com.array.ioc.bean.xml.di.Bean7"
>
<!--如果注入的是String,Integer基本包装类型直接用value赋值 -->
<property name="name" value="array7"></property>
<property name="age" value="8"/>
<!--引用数据类型注入 -->
<property name="bean8" ref="bean8"></property>
</bean>
<bean class="com.array.ioc.bean.xml.di.Bean8" id="bean8"></bean>
测试代码:
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");
Bean7 bean7 = (Bean7) act.getBean("bean7");
bean7.fn();
3.EL表达式注入
java代码Bean类:
这里同上使用的是Bean7
xml代码:
<!-- el表达式注入方式 -->
<bean>
<property name="name" value="#{'array2'}"></property>
<property name="age" value="#{55}"></property>
<property name="bean8" value="#{bean8}"></property>
</bean>
<bean class="com.array.ioc.bean.xml.di.Bean8" id="bean8"></bean>
测试代码:
同上setter注入
4集合注入:
java代码Bean类:
public class Bean9 {
//数组
private int[] intarr;
private List<String> list;
private HashMap<String,User> map;
private User user;
private User user1;
private Properties prop1;
public void setProp1(Properties prop1) {
this.prop1 = prop1;
}
public void setUser(User user) {
this.user = user;
}
public void setUser1(User user1) {
this.user1 = user1;
}
public void setIntarr(int[] intarr) {
this.intarr = intarr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(HashMap<String, User> map) {
this.map = map;
}
public void fn() {
System.out.println("bean9"+intarr+list.get(1)+map.get("user")+user);
System.out.println(user);
}
}
xml代码:
<!--数组与集合的注入类似 -->
<bean class="com.array.ioc.bean.xml.list.Bean9" id="bean9">
<!-- 数组注入 -->
<property name="intarr">
<array>
<value>11</value>
<value>12</value>
<value>14</value>
<value>15</value>
</array>
</property>
<!-- 集合注入 -->
<property name="list">
<list>
<value>array</value>
<value>object</value>
<value>keke</value>
</list>
</property>
<!-- map注入 -->
<property name="map">
<map>//map中的value是实体类
<entry key="1" value-ref="user1"></entry>
<entry key="2" value-ref="user"></entry>
//map中的value是简单的基础数据类型的两种设置方法
<!-- <entry>
<key>
<value>1</value>
</key>
<value>array</value>
</entry> -->
<!-- <entry key="" value=""></entry> -->
</map>
</property>
</bean>
<bean id="user" class="com.array.ioc.bean.xml.list.User">
<property name="username" value="haha"></property>
<property name="password" value="1212"></property>
</bean>
<bean id="user1" class="com.array.ioc.bean.xml.list.User">
<property name="username" value="zs"></property>
<property name="password" value="123"></property>
</bean>
测试代码:
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext3.xml");
Bean9 bean9 = (Bean9) act.getBean("bean9");
bean9.fn();
properties注入:
<!--注入properties -->
<property name="props">
<props>
<prop key="key1">hahah</prop>
<prop key="key2">wwww</prop>
</props>
</property>
5.注解注入:
(1)需要xml文件
3个相互注入的java类:
//这里@Component/@Controller("userAction")是同一个意思
//可以不用定义bean的名字默认是类名首字母小写
//@Controller("userAction")
@Component
public class UserAction {
//注解注入不需要setter方法
public void fn() {
// TODO 自动生成的方法存根
System.out.println("userAction");
}
}
@Repository
//@Component
public class UserDao {
// @Autowired(required=false)//required=true必须注值否则报错
// @Qualifier("userAction")
//与上面两句注解是同样的效果
@Resource(name="userAction")
private UserAction userAction;
public void fn() {
// TODO 自动生成的方法存根
System.out.println("userDao");
userAction.fn();
}
}
//@Component
@Service("userService")@Scope("prototype")
public class UserService {
@Autowired(required=false)
@Value("array")
private String name;
@Autowired(required=false)//required=true必须注值否则报错
@Qualifier("userDao")
private UserDao userDao;
public void fn() {
// TODO 自动生成的方法存根
System.out.println("userService"+name);
userDao.fn();
}
@PostConstruct
public void init() {
System.out.println("init");
}
@PreDestroy
public void destroy() {
System.out.println("destroy");
}
}
xml代码:进行扫包
<!--开起注解式的支持 -->
<context:component-scan base-package="com.array.ioc.annotation"/>
测试类:与junit相结合:
//设置运行类使用spring整合Junit的专用运行类
@RunWith(SpringJUnit4ClassRunner.class)//将当前类变成了bean
//设置spring环境对应的配置文件
@ContextConfiguration(locations="classpath:/application.xml")
public class JunitTest {
//将被测试对象最为资源注入到当前类中
@Autowired
@Qualifier("aa")
private UserService service;
@Test
public void test() {
service.fn();
}
}
(2)不需要xml配置文件的注入:
使用上面的三个Bean类
新建一个类注入bean:
@Configuration
//表示该文件加入扫描
public class BeanConfig {
@Bean(name="aa")
public static UserService getInst() {
System.out.println("getInst");
return new UserService();
}
}
测试代码
//免配置文件
AnnotationConfigApplicationContext act = new AnnotationConfigApplicationContext();
//将所有的注解加入道配置
act.register(BeanConfig.class);
act.register(UserService.class);
act.register(UserDao.class);
act.register(UserAction.class);
//注册完毕后刷新配置
act.refresh();
System.out.println(act.getBean("aa"));