Spring ioc详解
IOC:控制反转-对象<bean>
1 程序对象由原来本身程序自己创建,变为spring容器来创建。现在程序只能被动接受。什么时候创建的bean对象。当读取核心配置文件的时候,就创建了该对象!对象的生命周期完全由spring掌控!
2 使程序员只关注业务处理,而不需要关注对象的创建!
3 Ioc能够实现程序的解耦!降低程序的耦合度!
public interface UserDao { void getUser(); } public class UserMysqlDaoImpl implements UserDao {
@Override public void getUser() { System.out.println("Mysql 数据库获取的数据!"); }
} public class UserOracleDaoImpl implements UserDao {
@Override public void getUser() { System.out.println("oarcle 数据库获取的数据!"); }
} public interface UserService { void getUser(); }
public class UserServiceImpl implements UserService{ // 关键 private UserDao userDao;
public UserDao getUserDao() { return userDao; }
public void setUserDao(UserDao userDao) { this.userDao = userDao; }
@Override public void getUser() { // 关键是:什么时候给对象!此时该对象管理就交给我们的spring容器来管理! userDao.getUser(); }
} Beans.xml <!-- Ioc:控制反转,之前创建对象是由程序本身创建,现在对象是由spring容器来创建了。程序被动接受创建对象! --> <!-- value :是给的具体指!ref:指的是给对象的引用! --> <bean id="oracle" class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean> <bean id="mysql" class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>
<!-- ref="oarcle" 相当于 userDao = new UserOracleDaoImpl();--> <bean id="userServiceImpl" class="com.bjsxt.service.impl.UserServiceImpl" > <property name="userDao" ref="mysql"></property> </bean> 测试: ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl userServiceImpl = ac.getBean("userServiceImpl", UserServiceImpl.class); userServiceImpl.getUser(); 注意: <bean id="userServiceImpl" class="com.bjsxt.service.impl.UserServiceImpl" > <!-- userDao 具体指的是谁?UserServiceImpl类中的属性?是setter方法名,去了set字母。 由此得出结论:spring 依赖注意可以通过setter注入。 --> <property name="userDao1" ref="mysql"></property> </bean> |
Bean的生成方式
1.1 无参构造生成
public class Hello { public Hello() { } @Override public String toString() { return "我是无参构造!"; } } Beans.xml <bean id="hello" class="com.bjsxt.pojo.Hello"></bean> 测试类: ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = ac.getBean("hello", Hello.class); System.out.println(hello); |
1.2 有参构造
1.2.1 Type:通过数据类型注入:但是,在实际开发过程中不推荐使用。
public class Student { private int id; private String name; }
<bean id="student" class="com.bjsxt.pojo.Student"> <constructor-arg type="int" value="12"/> <constructor-arg type="String" value="高总"/> </bean> 测试: Student student = ac.getBean("student", Student.class); System.out.println(student); |
1.2.2 Index:通过下标来创建。
<!-- 有参构造 --> <bean id="student" class="com.bjsxt.pojo.Student"> <!-- index 代表第几个属性,小标从0开始 --> <constructor-arg index="0" value="12"/> <constructor-arg index="1" value="张惠妹"/> </bean> |
1.2.3 Name:spring2.x版本应该不支持name创建实体类
<bean id="student" class="com.bjsxt.pojo.Student"> <!-- name:指的就是属性名 --> <constructor-arg name="id" value="111"/> <constructor-arg name="name" value="赵本山"/> </bean> |
1.2.4 静态工厂
public class StudentStaticFactory { public static Student getStudent(int id,String name){ return new Student(id, name); } } <!-- 静态工厂 factory-method:指的是工厂中创建实体类的方法--> <bean id="student" class="com.bjsxt.pojo.StudentStaticFactory" factory-method="getStudent"> <constructor-arg index="0" value="1"/> <constructor-arg index="1" value="董卿"/> </bean> |
1.2.5 动态工厂
public class StudentDynamicFactory { public Student getStudent(int id,String name){ return new Student(id, name); } } <bean id="dynamic" class="com.bjsxt.pojo.StudentDynamicFactory"/> <!-- 动态工厂:factory-bean:指的是动态工厂的bean:id --> <bean id="student" class="com.bjsxt.pojo.Student" factory-bean="dynamic"> <constructor-arg index="0" value="2"/> <constructor-arg index="1" value="黄渤"/> </bean> |
Scope属性
1 Singleton 单例:<bean>标签默认的就是单例
2 prototype原型:多例模式,每次创建的时候,则会实例化一个 新的对象
3 request 每次请求时创建一个新的对象
4 session 在会话的范围内时一个对象
5 global session 只在portlet下有用,表示是application
6 application 在应用范围中一个对象
User user = ac.getBean("user",User.class); System.out.println(user); User user1 = ac.getBean("user",User.class); System.out.println(user1); System.out.println("8888888888888888888888"); System.out.println(user==user1); |