Application Frameworks Birgit Hecker Seminar Software Engineering 1 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 2 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 3 Birgit Hecker Grundlagen Framework Framework „Ein Framework ist eine Menge von kooperierenden Klassen, die einen wiederverwendbaren Entwurf für einen bestimmten Anwendungskontext vorgeben. Das Framework bestimmt dabei die Architektur der Applikation.“ Umkehrung des Kontrollflusses (Inversion of Control) Hollywood-Prinzip („Don’t call us, we call you“) Application Frameworks 4 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 5 Birgit Hecker Spring OpenSource-Framework Grundlage: Buch "Expert One-On-One J2EE Design and Development“ von Rod Johnson Merkmale: Dependency Injection und AOP Module Quelle: http://static.springframework.org Application Frameworks 6 Birgit Hecker Beispielanwendung Bibliothek Application Frameworks 7 Birgit Hecker Beispielanwendung Application Frameworks 8 Birgit Hecker Spring Bean Java-Klasse, welche über eine spezielle Konfiguration zur Spring Bean wird Beispiel: <!-- DataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource. SingleConnectionDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/bib" /> <property name="username" value=“sa" /> <property name="password" value=“123" /> </bean> Application Frameworks 9 Birgit Hecker Spring Container erstellt, verbindet, konfiguriert und verwaltet alle Spring-Beans über deren kompletten Lebenszyklus Zwei Typen BeanFactory ApplicationContext BeanFactory factory = new XmlBeanFactory (new FileSystemResource("applicationContext.xml")); SampleBean sampleBean = (SampleBean)factory.getBean("sampleBean"); Application Frameworks 10 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 11 Birgit Hecker Dependency Injection Programmiertechnik um die Abhängigkeiten zwischen Objekten zu minimieren Übergabe der Verantwortung für die abhängige Objekten an das Framework Injizieren der Abhängigkeiten zur Laufzeit z. B. über XML-Datei Application Frameworks 12 Birgit Hecker Dependency Injection Setter-Injection <bean id=“Ex4711" class="bib.Exemplar"> <property name="id" value="4711" /> <property name="book" ref="B4711" /> </bean> Constructor-Injection <bean id="Ex4711" class="bib.Exemplar"> <constructor-arg value="4711" /> <constructor-arg ref="B4711" /> </bean> Application Frameworks 13 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 14 Birgit Hecker Aspektorientierte Programmierung Zur Vermeidung von Codewiederholungen Prinzip „Separation of Concerns“ Auslagerung von sich wiederholenden Teilen: Aspekt Aspekte = Querschnittsbelange (Cross Cutting Concerns) In Spring: Nutzung via Proxy Joinpoint Stelle, an der in der Anwendung ein Aspekt eingebunden werden kann Pointcut Programmkonstrukt zur Auswahl von einem oder mehreren Joinpoints Wo wird der Aspekt ausgeführt? Advice Was wird wann ausgeführt? Application Frameworks 15 Birgit Hecker Aspektorientierte Programmierung Advice package aop; public class LoggingAdvice implements MethodInterceptor { public Object invoke(MethodInvocation methodInvocation){ Log log; log = LogFactory.getLog(getClassName(methodInvocation)); log.info("Class : " + getClassName(methodInvocation)); log.info("Method : " + getMethodName(methodInvocation)); log.info("Arguments : " + getArguments(methodInvocation)); ... //ausführen der eigentlichen Methode result = methodInvocation.proceed(); ... } ... } Application Frameworks 16 Birgit Hecker Aspektorientierte Programmierung AOP Konfiguration <!-Advice--> <bean id="loggingInterceptor" class="aop.LoggingAdvice" /> <!—Pointcut--> <bean id="loggingPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"> <property name="pattern" value="services.*" /> </bean> <!—Advisor--> <bean id="loggingAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor"> <property name="advice" ref="loggingInterceptor" /> <property name="pointcut" ref="loggingPointcut" /> </bean> Application Frameworks 17 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 18 Birgit Hecker Datenbankanbindung Spring DAO Kapselung des Datenbankzugriffs durch Data Access Objects Verwendung des Template-Entwurfsmuster Quelle: [Wa08] Application Frameworks 19 Birgit Hecker Datenbankanbindung DAO package jdbc; public class BookDAO extends JdbcDaoSupport implements IBookDao{ public List getAll() { return (List) getJdbcTemplate().query( "SELECT DESCRIPTION, ISBN, AUTOR, ID FROM Book ", new BookRowMapper()); } … } <!– DAO --> <bean id="bookDAO" class="jdbc.BookDAO"> <property name="jdbcTemplate" ref="template" /> </bean> Application Frameworks 20 Birgit Hecker Datenbankanbindung Datenquelle und Template JDBC-Anbindung <!-- Datenquelle --> <bean id="datasource" class= "org.springframework.jdbc.datasource.SingleConnectionDataSource"> <property name=”driverClassName” value=”com.mysql.jdbc.Driver” /> <property name=”url” value=”jdbc:mysql://localhost/bib” /> <property name=”username” value=”sa” /> <property name=”password” value=”123” /> </bean> <!-- JDBC Template --> <bean id="template" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> <property name="nativeJdbcExtractor"> <bean class="org.springframework.jdbc.support.nativejdbc. CommonsDbcpNativeJdbcExtractor" /> </property> </bean> Application Frameworks 21 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 22 Birgit Hecker Modell View Controller Spring MVC 2 3 1 4 Quelle: [Wa08] <bean name=”/book.htm“ class=“mvc.BookController“> <property name=”bookService” ref=”bookService”/> </bean> Application Frameworks 23 Birgit Hecker Modell View Controller Controller package mvc; public class BookController extends AbstractController{ private BookService bookService; private String view = "booklist"; public BookService getBookService() { return bookService; } public void setBookService(BookService bookService) { this.bookService = bookService; } protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { Map model = new HashMap(); model.put("books", bookService.getBooks()); return new ModelAndView(view, model); } Application Frameworks 24 Birgit Hecker Modell View Controller Spring MVC 6 5 Quelle: [Wa08] <bean id="viewResolver" class="…InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> Ergebnis: /WEB-INF/jsp/booklist.jsp Application Frameworks 25 Birgit Hecker Modell View Controller 6 View <%@ page language="Java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head>…</head> <body> <h1>Willkommen in der Bibliothek</h1><br> <h2>Hier sehen Sie alle verfügbaren Bücher</h2><br> <table> <tr><th>Buch</th><th>Autor</th></tr> <c:forEach items="${books}" var="book"> <tr> <td><c:out value="${book.description}"/></td> <td><c:out value="${book.autor}"/></td> <td><c:out value="${book.ISBN}"/></td> </tr> </c:forEach> </table> </body> </html> Application Frameworks 26 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 27 Birgit Hecker Sicherheit Spring Security Authentifizierung und Autorisierung auf Webanfrage- und Methodenaufrufebene Spring Security nutzt dafür DI und AOP Authentification-Managers überprüft den Benutzernamen und das Passwort Access-Decision-Manager prüft die Benutzerrechte Application Frameworks 28 Birgit Hecker Sicherheit Authentifizierung Quelle: [Wa08] Application Frameworks 30 Birgit Hecker Sicherheit Autorisierung Aufruf einer geschützten Methode Application Frameworks 34 Birgit Hecker Sicherheit Autorisierung <bean id="securityInterceptor" class="org.springframework.security. method.aopalliance.MethodSecurityInterceptor"> <property name="authenticationManager"> <ref bean="authenticationManager"/> </property> <property name="accessDecisionManager"> <ref bean="accessDecisionManager"/> </property> <property name="objectDefinitionSource"> <value> services.BookService.getBooks*=ROLE_USER services.LendingService.getLendings*=ROLE_USER services.UserService.getUsers*=ROLE_ADMIN services.LendingService.deleteById*=ROLE_ADMIN services.LendingService.save*=ROLE_ADMIN </value> </property> </bean> Application Frameworks 35 Birgit Hecker Sicherheit Autorisierung <!--AutoProxy--> <bean id="autoProxyCreator" class="org.springframework.aop. framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <value>securityInterceptor</value> </list> </property> <property name="beanNames"> <list> <value>bookService</value> <value>lendingService</value> <value>userService</value> <value>exemplarService</value> </list> </property> </bean> Application Frameworks 36 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 37 Birgit Hecker Vergleich Spring und Java EE Spring als Lightweight-Modell zu Java EE Dependency Injection Wird von beiden unterstützt In Java EE nur für Java EE Elemente wie EJB, Servlets Konfiguration Spring: Deskriptoren Java EE: Annotationen AOP Spring: Grundfunktionalität Java EE: Interceptor-Konzept für EJB 3.0 Java EE ist ein Standard Application Frameworks 38 Birgit Hecker Agenda Grundlagen Spring Framework Dependency Injection Aspektorientierte Programmierung Datenbankanbindung Modell View Controller Sicherheit Spring vs. Java EE Zusammenfassung Application Frameworks 39 Birgit Hecker Zusammenfassung und Ausblick Spring DI und AOP Datenbankanbindung MVC Sicherheit Ausblick Gute Dokumentation von Spring verfügbar Bücher und Webseiten Weiterentwicklung und Unterstützung Application Frameworks 40 Birgit Hecker Vielen Dank für die Aufmerksamkeit! Application Frameworks 41 Birgit Hecker